具有特定属性的子实例的Django MPTT查询集

时间:2016-12-23 13:10:22

标签: python django django-mptt

我正在使用Django MPTT,模型Foobar就像这样:

class Foobar(MPTTModel):
     parent = TreeForeignKey('self', null=True, blank=True, related_name='children')

如果我想选择所有带孩子的Foobars,我可以这样做:

[x for x in Foobar.objects.all() if x.get_children().exists()]

如果我想选择所有具有特定属性子项的Foobar(如published),我可以这样做:

[x for x in Foobar.objects.all() if x.get_children().filter(published=True).exists()]
但是,我无法找到在一个查询中执行此操作的方法。我需要在一个查询中执行此操作,以便能够将其用于ForeignKey的{​​{3}}参数:

class Example(models.Model):
    related_foobar = models.ForeignKey(
        Foobar,
        limit_choices_to=Q(....), # How do I make this work?
    )

1 个答案:

答案 0 :(得分:1)

好吧,作为父母的纯属性是通过__isnull过滤器过滤的。这通常适用于反向外键测试:

Foobar.objects.filter(children__isnull=False)  # must have children

应该提到此查询中的'children'related_query_name的{​​{1}}。默认情况下,如果提供了ForeignKey,则默认为小写的模型名称(在这种情况下为related_name)。

使用具体的子属性,您可以执行以下操作:

foobar

这将仅包含Foobar.objects.filter(children__published=True) ,其中至少有一个已发布的子项。