Question

I'm just starting out with Django and the REST Framework and I'm getting an error when trying to POST an entity. There error is: {"non_field_errors": ["Invalid data"]}. This happens at the line serializer.is_valid()

This is is what my view class looks like:

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)

Here is my Payload model for reference:

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'


It's worth noting that if I set up my view properly and actually pass in a Json Payload object as part of the request, it works fine.

Working JSON payload: {"code": "NPMC", "body": "Hello World"}

Working view code:

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)

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

Was it helpful?

Solution

Ok I was able to find a solution to my problem by making use of Djangos 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)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top