2012-12-05 126 views
1

所以,我挣扎在以下情况:查询其父母有孩子在Django

考虑车型:

class A(models.Model): 
    foo = models.IntegerField(default=0) 

class B(models.Model): 
    a_models = models.ForeignKey('A', related_name='b_models') 
    bar = models.IntegerField(default=0) 

class bChild(B): 
    bla = models.IntegerField(default=0) 

,如果我有一个,a_instance一个实例,我想检索的与它的关系在B类的所有实例,我可以用

all_b_models = a_instance.b_models.all() 

我的问题是:

:如果我想只检索也有bChilds的那些什么
all_bChild_models = a_instance.b_models.filter(???) 

我应该在“???”中放什么?

我没有找到任何文档。有一件事我觉得工作原理是利用:

??? = pk__in=bChild.objects.all().values_list('pk') 

然而,由于Django的创建多表继承隐式的落后的关系,我想知道是否有一个更简单的查询。

感谢, 豪尔赫

回答

1

有你为什么要取bChild对象只能通过一个实例时,你可以简单地做的理由是:

result = bChild.objects.filter(a_models = a) 

你的做法是行不通的,你需要一个平板清单过滤pk:

all_bChild_models = a_instance.b_models.filter(pk__in = bChild.objects.values_list('pk', flat=True)) 
+0

好吧,我不知道有关过滤的“a_models”......在任何情况下,你能重新表达第一句话吗?我不明白你的意思... –

+0

对不起,我的坏..我打算问你为什么你想直接在a_instance上查询,当你可以直接在bChild表上直接进行查询时。 –

1

嗯,我想通了自己。

显然,如果模型没有孩子,django认为pk为null。

因此,可以使用:

all_bChild_models = a_instance.b_models.filter(bchild__pk__isnull=False) 

这将返回其必须在它bChild模型指向的所有B型。