Home > Mobile >  Django rest-framework , Serializer returning assertion Error
Django rest-framework , Serializer returning assertion Error

Time:11-13

I'm extending my current model to have some common properties from other base classes. Before extending the model, everything was working fine. But after extending, I'm getting the assertion error while performing put and post Operation. I tried my best to resolve it by my own. But not getting where it is going wrong. Can anyone help me on this? Please find my model and serializers below.

basemodel.py

from django.db import models

class BaseModel(models.Model):
    created_at=models.DateTimeField(auto_now=True)
    updated_at=models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

softdelete.py

from django.db import models

class SoftDeleteModel(models.Model):
    is_deleted = models.BooleanField(default=False)

    def delete(self):
        self.is_deleted = True
        self.save()

    def restore(self):
        self.is_deleted = False
        self.save()

    class Meta:
        abstract = True

movies.py

from django.db import models
from cinimateApp.models.comman.softdelete import SoftDeleteModel
from cinimateApp.models.comman.basemodel import BaseModel

# Create your models here.

class Movies(SoftDeleteModel,BaseModel):
    name=models.CharField(max_length=250)
    description=models.CharField(max_length=250)
    active=models.BooleanField(default=False)

    def __str__(self):
        return self.name

movieSerializer.py

#Model Serializer

from rest_framework import serializers
from cinimateApp.models.movies import Movies

class MovieSerializer(serializers.ModelSerializer):

    class Meta:
        model = Movies
        fields = '__all__' 
        # fields=['id', 'name', 'description', 'active']
        # exclude=['name']
    
    # field Level Validation
    def validate_name(self,value):
        if(len(value)<3):
            raise serializers.ValidationError('name is too short')
        return value

    #Objectlevel validation
    def validate(self,data):
        if(data['name']==data['description']):
            raise serializers.ValidationError('name and description should be different')
        return 

    #custome serializer field
    name_length=serializers.SerializerMethodField()
    def get_name_length(self,object):
        return len(object.name)
    

views.py

from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework import status
from rest_framework.response import Response
from cinimateApp.serializers.movieSerializer import MovieSerializer
from cinimateApp.models.movies import Movies

# Create your views here.

class MovieList(APIView):
    def get(self,request):
        movies=Movies.objects.all()
        serializer=MovieSerializer(movies,many=True)
        return Response(serializer.data,status=status.HTTP_200_OK)

    def post(self,request):
        serialiser=MovieSerializer(data=request.data)
        if(serialiser.is_valid()):
            serialiser.save()
            return Response(serialiser.data,status=status.HTTP_201_CREATED)
        else:
            return Response(serialiser.errors,status=status.HTTP_500_INTERNAL_SERVER_ERROR)

class MovieDetailsAV(APIView):
    def get(self,request,id):
        try:
            movie=Movies.objects.get(pk=id)
            serializer=MovieSerializer(movie)
            return Response(serializer.data,status=status.HTTP_200_OK)
        except Movies.DoesNotExist:
            return Response({'Error':'Movie not found'},status=status.HTTP_404_NOT_FOUND)

    def put(self,request,id):
        try:
            movie=Movies.objects.get(pk=id)
            serializer=MovieSerializer(movie,data=request.data)
            if(serializer.is_valid()):
                serializer.save()
                return Response(serializer.data,status=status.HTTP_200_OK)
            return Response(serializer.errors,status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        except Movies.DoesNotExist:
            return Response({'Error':'Movie not found'},status=status.HTTP_404_NOT_FOUND)

    def delete(self,request,id):
        try:
            movie=Movies.objects.get(pk=id)
            movie.delete()
            return Response({'message' : 'Content deleted successfully'},status=status.HTTP_204_NO_CONTENT)
        except Movies.DoesNotExist:
            return Response({'Error':'Movie not found'},status=status.HTTP_404_NOT_FOUND)

    def patch(self,request,id):
        try:
            movie=Movies.objects.get(pk=id)
            serializer=MovieSerializer(movie,data=request.data,partial=True)
            if(serializer.is_valid()):
                serializer.save()
                return Response(serializer.data,status=status.HTTP_200_OK)
            return Response(serializer.errors,status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        except Movies.DoesNotExist:
            return Response({'Error':'Movie not found'},status=status.HTTP_404_NOT_FOUND)

I'm getting following errors for put and post requests. assert value is not None, '.validate() should return the validated data' AssertionError: .validate() should return the validated data

CodePudding user response:

validate() function should return data

def validate(self,data):
        if(data['name']==data['description']):
            raise serializers.ValidationError('name and description should be different')
        return data
  • Related