我有一个简单的数据库,其中包含两个定义父子关系的模型。在它中,一个孩子可以有两种可能的性别,";雄性";或";女性";。
class Parent(models.Model):
id = models.UUIDField(primary_key=True, editable=False, unique=True, )
name = models.CharField(max_length=64)
MALE = "MALE"
FEMALE = "FEMALE"
class Child(models.Model):
id = models.UUIDField(primary_key=True, editable=False, unique=True, )
name = models.CharField(max_length=64)
parent = models.ForeignKey(
Parent,
null=True,
on_delete=models.SET_NULL)
GENDER = [
(MALE, 'Male'),
(FEMALE, 'Female'),
]
status = models.CharField(
max_length=8,
choices=GENDER
)
就这个问题而言,父母只会有零个或一个男性孩子,零个或1个女性孩子。(尽管这在数据库模型定义中没有强制执行。(
我想要实现的是一个annoted查询,它返回所有Parent
对象,用它们的男子和女子进行annoted。我不太清楚如何制作:我可以得到一份所有父母、所有男性和女性孩子的列表,但我不知道如何将它们放在一起,让合适的孩子和合适的父母在一起。
这是我所了解的:
annotated_parent_set = Parent.objects.get_queryset()
brothers = Child.objects.filter(gender=MALE)
sisters = Child.objects.filter(gender=FEMALE)
annotated_parent_set = annotated_parent_set.annotate(
brother=F(???))
)
annotated_parent_set = annotated_parent_set.annotate(
sister=F(???))
)
我现在如何合并这些家伙以获得我想要的注释?
您不需要对此进行注释,您可以.prefetch_related(…)
[Django doc]使用:
annotated_parent_set = Parent.objects.prefetch_related('child_set')
或者,如果要使用.brothers
和.sisters
,则可以使用两个Prefetch
对象[Django-doc]:
from django.db.models import Prefetch
annotated_parent_set = Parent.objects.prefetch_related(
Prefetch('child_set', Child.objects.filter(status=MALE), to_attr='brothers'),
Prefetch('child_set', Child.objects.filter(status=FEMALE), to_attr='sisters')
)