I want to do a 3 lvl prefetch_related but I can't make it work.
views.py:
queryset = obj.answer.all().prefetch_related(Prefetch('question ', queryset=Question.objects.prefetch_related(Prefetch('orderedquestion', queryset=OrderedQuestion.objects.prefetch_related('select_set')))))
return AnswerSerializer(queryset, many=True).data
And on my Serializers.py I call it like that:
json['name'] = answer.question.orderedquestion.select_set.get(id=i).name
I don't know if this metters but my OrderedQuestion class inherits from Question.
My Models.py
class Answer(models.Model):
updated_datetime = models.DateTimeField(default=timezone.now)
profile = models.ForeignKey(Profile, related_name='answer', on_delete=models.CASCADE)
question = models.ForeignKey(Question, related_name='answer', on_delete=models.CASCADE)
order = JSONField(blank=True, null=True)
class Question(models.Model):
objects = InheritanceManager()
title_question = models.CharField(max_length=256, unique=True)
title_interest = models.CharField(max_length=256)
description_question = models.CharField(max_length=2048, null=True, blank=True)
description_interest = models.CharField(max_length=2048, null=True, blank=True)
category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, blank=True)
class OrderedQuestion(Question):
multiple_choice = models.BooleanField(default=False)
dont_care = models.BooleanField(default=False)
class Select(models.Model):
name = models.CharField(max_length=1024)
choice_question = models.ForeignKey(ChoiceQuestion, on_delete=models.CASCADE, null=True, blank=True)
ordered_question = models.ForeignKey(OrderedQuestion, on_delete=models.CASCADE, null=True, blank=True)
def __str__(self):
return str(self.id) + ' - ' + self.name
How can I fetch select_set on the first query so my serializer stop doing N queries for each object?
Thank you so much for the help.