【问题标题】:Query parents which have child in django在 django 中查询有孩子的父母
【发布时间】:2012-12-05 15:48:17
【问题描述】:

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

考虑模型:

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

谢谢, 豪尔赫

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    嗯,我自己想出来的。

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

    所以,可以使用:

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

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

    【讨论】:

      【解决方案2】:

      当您可以简单地执行此操作时,您是否只想通过 A 实例获取 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))
      

      【讨论】:

      • 好吧,我不知道过滤中的“a_models”......无论如何,你能重新表述第一句话吗?我不明白你的意思...
      • 对不起..我的意思是问你为什么要直接在 a_instance 上进行查询,而你可以轻松地直接在 bChild 表上进行查询。
      猜你喜欢
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多