在Django中查找带注释的兄弟姐妹列表



我有一个简单的数据库,其中包含两个定义父子关系的模型。在它中,一个孩子可以有两种可能的性别,";雄性";或";女性";。

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')
)

相关内容

  • 没有找到相关文章

最新更新