【发布时间】:2019-10-13 00:53:07
【问题描述】:
我有 3 个模型:
class Project(models.Model):
name = models.CharField(max_length=300, unique=True)
description = models.CharField(
max_length=2000,
blank=True,
null=True,
default=None
)
class QuestionSession(models.Model):
name = models.CharField(
max_length=500, default=None, null=True, blank=True
)
project = models.ForeignKey(
Project,
on_delete=models.CASCADE,
related_name='sessions',
blank=True,
null=True,
default=None
)
class Question(models.Model):
description = models.CharField(max_length=500)
question_session = models.ForeignKey(
QuestionSession,
on_delete=models.CASCADE,
related_name='questions',
blank=True,
null=True,
default=None
)
如您所见,Project 包含 Sessions,Session 包含问题。 我想要实现的是我想获取一个包含会话和问题数量的项目。我可以用 2 个不同的查询轻松完成,但我不能在 1 个查询中完成。
我的序列化器:
class SingleProjectSerializer(serializers.ModelSerializer):
sessions = MinifiedSessionSerializer(many=True)
class Meta:
model = Project
fields = [
'id',
'name',
'description',
'sessions'
]
class MinifiedSessionSerializer(serializers.ModelSerializer):
questions_number = serializers.IntegerField()
class Meta:
model = QuestionSession
fields = [
'id',
'name',
'questions_number'
]
我曾经像这样在单个查询中获取会话:
Project.objects.get(id=project_id).sessions.annotate(questions_number=Count('questions'))
但是现在该怎么做呢?我需要先获取项目,然后在会话上进行注释。我不知道该怎么做。我需要这样的查询:
Project.objects.filter(pk=project_id).annotate(sessions__questions_number=Count('sessions__questions'))
【问题讨论】:
-
prefetch_related()是你的朋友。它将执行一个额外的查询来获取所有会话,您可以向它提供一个查询集,其中包含带有注释的问题数的会话。
标签: django django-models django-rest-framework