my models
class AssessmentTest(BasicModel):
title = models.CharField(max_length=120, unique=True)
class UserTestResult(BasicModel):
assessment_test = models.ForeignKey(AssessmentTest, on_delete=models.CASCADE, related_name='users_passed')
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='test_results')
points = models.PositiveIntegerField(default=0)
my views
class AssessmentTestView(ReadOnlyModelViewSet):
serializer_class = AssessmentTestSerializer
queryset = AssessmentTest.objects.all()
my serializers
class AssessmentTestListSerializer(serializers.ModelSerializer):
class Meta:
model = AssessmentTest
fields = [
'id',
'title',
'user_results',
]
user_results = serializers.SerializerMethodField()
def get_user_results(self, obj: AssessmentTest):
user = self.context['request'].user
if not user.is_anonymous:
test_result = UserTestResult.objects.filter(assessment_test=obj, user=user)
if test_result:
return UserTestResultSerializer(instance=test_result.last()).data
return None
When I try to get all tests, in get_user_results
I face n+1 problem (for every test there is extra query to UserTestResult)
Can I somehow avoid this? Maybe it's possible to use prefetch_related on reverse foreign_key in queryset? Or not? Can someone help?
UserTest
inAssessmentTest
. Take a look at the docs on the subject if you wish. \$\endgroup\$