查询django中有孩子的父母

时间:2012-12-05 15:48:17

标签: django django-queryset

所以,我在以下情况下苦苦挣扎:

考虑模型:

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,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为Multi-table继承创建了一个隐式的向后关系,我想知道是否有更简单的查询。

谢谢, 乔治

2 个答案:

答案 0 :(得分:1)

当你可以简单地执行此操作时,是否有理由只想通过A实例获取Child对象:

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

答案 1 :(得分:1)

好吧,我自己想出来了。

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

所以,可以使用:

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

这将返回所有b模型指向它的b模型。