【问题标题】:Python/Django with REST Framework - Error on POST {"non_field_errors": ["Invalid data"]}带有 REST 框架的 Python/Django - POST 错误 {"non_field_errors": ["Invalid data"]}
【发布时间】:2014-04-06 15:38:27
【问题描述】:

我刚开始使用 Django 和 REST Framework,尝试发布实体时出现错误。错误是:{"non_field_errors": ["Invalid data"]}。这发生在 serializer.is_valid()

这就是我的视图类的样子:

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from API.models import Payload
from API.serializers import PayloadSerializer
from API.services import PayloadService


class JSONResponse(HttpResponse):
    """
    An HttpResponse that renders its content into JSON.
    """

    def __init__(self, data, **kwargs):
        content = JSONRenderer().render(data)
        kwargs['content_type'] = 'application/json'
        super(JSONResponse, self).__init__(content, **kwargs)


    @csrf_exempt
    def payload_list(request):


        if request.method == 'POST':

            model = Payload(code="754d", body="Hello World")

            serializer = PayloadSerializer(data=model)

            if serializer.is_valid():
                serializer.save()
                return JSONResponse(serializer.data, status=201)
    return JSONResponse(serializer.errors, status=400)

这是我的 Payload 模型供参考:

from __future__ import unicode_literals
from sqlserver_ado.fields import BigAutoField
from django.db import models


class Payload(models.Model):
    id = BigAutoField(db_column='Id', primary_key=True) # Field name made lowercase.
    code = models.CharField(db_column='Code', max_length=10) # Field name made lowercase.
    body = models.TextField(db_column='Body') # Field name made lowercase.
    class Meta:
        managed = False
        db_table = 'Payload'


值得注意的是,如果我正确设置了我的视图,并且实际上将一个 Json Payload 对象作为请求的一部分传入,它就可以正常工作。

工作 JSON 负载:{"code": "NPMC", "body": "Hello World"}

工作视图代码:

if request.method == 'POST':

    data = JSONParser().parse(request)

    serializer = PayloadSerializer(data=data)

    if serializer.is_valid():
        serializer.save()
        return JSONResponse(serializer.data, status=201)
    return JSONResponse(serializer.errors, status=400)

回复:{"id": 25, "code": "NPMC", "body": "Hello World"}

【问题讨论】:

    标签: python django django-models django-views django-rest-framework


    【解决方案1】:

    好的,我能够通过使用 Django model_to_dict找到解决我的问题的方法

    from django.http import HttpResponse
    from django.views.decorators.csrf import csrf_exempt
    from rest_framework.renderers import JSONRenderer
    from rest_framework.parsers import JSONParser
    from API.models import Payload
    from API.serializers import PayloadSerializer
    from API.services import PayloadService
    from django.forms.models import model_to_dict
    
    
    
    class JSONResponse(HttpResponse):
        """
        An HttpResponse that renders its content into JSON.
        """
    
        def __init__(self, data, **kwargs):
            content = JSONRenderer().render(data)
            kwargs['content_type'] = 'application/json'
            super(JSONResponse, self).__init__(content, **kwargs)
    
    
    @csrf_exempt
    def payload_list(request):
    
        if request.method == 'POST':
    
            model = Payload(code="754d", body="Hello World")
    
            result = model_to_dict(model, fields=[], exclude=[])
    
            serializer = PayloadSerializer(data=result)
    
            if serializer.is_valid():
                serializer.save()
                return JSONResponse(serializer.data, status=201)
            return JSONResponse(serializer.errors, status=400)
    

    【讨论】:

      猜你喜欢
      • 2015-04-05
      • 2014-09-18
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 2015-05-10
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多