Search code examples
pythondjangodjango-rest-framework

Getting nested models fields. Serializer error. Object of type QuerySet is not JSON serializable


I'm having a trouble with getting nested object in Django. My main purpose is generating JSON object from nestedDjango objects.

I have models as below:

class SurveyAnswer(models.Model):
   id = models.UUIDField(default=uuid.uuid4, unique=True,
        primary_key=True, editable=False)
   survey=models.ForeignKey("Survey",on_delete=models.CASCADE)
   answer=models.ForeignKey("Answer",on_delete=models.CASCADE)
   total_count=models.IntegerField(null=True,blank=True)
   total_percentage=models.FloatField(null=True,blank=True)

   class Meta:
       db_table="SurveyAnswer"


class Answer(models.Model):
   id = models.UUIDField(default=uuid.uuid4, unique=True,
      primary_key=True, editable=False)
   name= models.CharField(max_length=100)

   def __str__(self) -> str:
    return self.name
   class Meta:
    db_table="Answer"

I want to get all UserAnswer records with related Answer model(just name field in Answer model). To be able to do that I created serializer as below but this time I got error like 'Object of type QuerySet is not JSON serializable'.

What am I supposed to do? Is there any easy way to do that?

class SurveyAnswerSerializer(serializers.ModelSerializer):
   answers=serializers.StringRelatedField()

class Meta:
    model=SurveyAnswer
    fields=["id","total_count","total_percentage","answers",]

Tried blitzoc suggestion but this time it returns empty object.

 survey_answers=list(SurveyAnswer.objects.filter(survey=survey).select_related('answer'))

data=SurveyAnswerSerializer(survey_answers).data

Data is empty.Normally I am able to get data without serialization operation.


Solution

  • Finally I have managed to fixed it. You can find serializer codes below:

    class SurveySerializer(serializers.ModelSerializer):
        class Meta:
            model = Survey
            fields = ['name',]
    class AnswerSerializer(serializers.ModelSerializer):
        class Meta:
            model = Answer
            fields = ["id",'name','slug','css_class']
    
    class SurveyAnswerSerializer(serializers.ModelSerializer):
        class Meta:
            model = SurveyAnswer
            fields = ['id', 'answer','display_order','total_count']
            depth=1
    

    Usage:

    survey_answers=list(SurveyAnswer.objects.filter(survey=survey).select_related('answer').order_by('display_order'))
    
    data=SurveyAnswerSerializer(survey_answers,many=True).data
    
    return JsonResponse({'survey_answers':data},status=status.HTTP_200_OK)