Сократите количество запросов к базам данных
мои модели
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)
мои взгляды
class AssessmentTestView(ReadOnlyModelViewSet):
serializer_class = AssessmentTestSerializer
queryset = AssessmentTest.objects.all()
мои сериализаторы
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
Когда я пытаюсь получить все тесты, в get_user_results я сталкиваюсь с проблемой n+1 (для каждого теста есть дополнительный запрос к UserTestResult)
Могу ли я как-то избежать этого? Может быть можно использовать prefetch_related на обратном foreign_key в queryset? Или нет? Кто-нибудь может помочь?