我正在使用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?
)
答案 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)
,其中至少有一个已发布的子项。