Search code examples
djangodjango-modelsdjango-rest-frameworkdjango-viewsdjango-serializer

not getting the data from Serializer


view.py

@csrf_exempt

def blog_list(request):

if request.method == 'GET':
    post = Post.objects.all()
    serializer = BlogSerializer(post, many=True)
    return JsonResponse(serializer.data,safe=False)

elif request.method == 'POST':
    data = JSONParser().parse(request)
    serializer = BlogSerializer(data=data)
    if serializer.is_valid():
        serializer.save()
        return JsonResponse(serializer.data, status=201)
    return JsonResponse(serializer.errors, status=400)

class BlogSerializer(serializers.Serializer):

class Meta:
    model = Post
    fields = ['author', 'title',  'text',  'published_date']

class Post(models.Model):

author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
published_date = models.DateTimeField(blank=True, null=True)

def publish(self):
    self.published_date = timezone.now()
    self.save()

def __str__(self):
    return self.title

Solution

  • First you need to understand a few things about this code

    def blog_list(request):
        if request.method == 'GET':
            post = Post.objects.all()
            serializer = BlogSerializer(post, many=True)
            return JsonResponse(serializer.data,safe=False)
    
        elif request.method == 'POST':
            data = JSONParser().parse(request)
            serializer = BlogSerializer(data=data)
            if serializer.is_valid():
                serializer.save()
                return JsonResponse(serializer.data, status=201)
            return JsonResponse(serializer.errors, status=400)
    

    Here request referes to a request object, which contains all the data inside the request (method, body, data, headers, etc), and not just the request data. So, you want to parse request.body, instead of request.

    data = JSONParser().parse(request.body)