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.
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)