2016-12-23 41 views
0

我使用Django MPTT,与模型Foobar的是这样的:Django的MPTT查询集的情况下,与孩子有特定属性的

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()] 

如果我要选择具有特定属性的孩子们都Foobars(如published),我可以这样做:

[x for x in Foobar.objects.all() if x.get_children().filter(published=True).exists()] 

尽管如此,我无法在一个查询中找到解决方法。我需要做的是在一个查询,以便能够使用它的ForeignKeylimit_choices_to说法:

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

您是否有通过'Foobar' Meta中的'parent_attr'指定的'parent'字段?如果是这样,那么'related_name'是什么? – schwobaseggl

+0

@schwobaseggl我编辑了我的答案以包含该信息。 – Flimm

回答

1

好,为人父母的纯财产通过__isnull过滤器过滤的。这一般适用于相反的外键测试:

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

应该提到的是'children'在此查询是ForeignKeyrelated_query_name。默认为related_name(如果提供)或小写模型名称(在这种情况下为foobar)。

有了一个具体的子属性,你可以简单地做:

Foobar.objects.filter(children__published=True) 

这将只包括Foobars至少有一个孩子被出版。

相关问题