【问题标题】:Django query to select parent with nonzero childrenDjango查询以选择具有非零子级的父级
【发布时间】:2010-04-12 16:04:54
【问题描述】:

我的模型本身有一个外键,如下所示:

class Concept(models.Model):
    name = models.CharField(max_length=200)
    category = models.ForeignKey('self')

但我不知道如何选择所有具有非零子值的概念。这可以通过 django QuerySet API 实现还是我必须编写自定义 SQL?

【问题讨论】:

    标签: django hierarchical-data django-queryset


    【解决方案1】:

    如果我理解正确,每个Concept 可能有另一个Concept 作为父级,这被设置到category 字段中。
    换句话说,至少有一个孩子的Concept 将在category 字段中至少被引用一次。

    一般来说,这在 Django 中并不容易获得;但是,如果您没有太多类别,您可以考虑类似SELECT * FROM CONCEPTS WHERE CONCEPTS.ID IN (SELECT CATEGORY FROM CONCEPTS); 的查询 - 这是您可以使用 Django 轻松映射的内容:

    Concept.objects.filter(pk__in=Concept.objects.all().values('category'))
    

    请注意,如Django documentation 所述,此查询在某些数据库上可能存在性能问题;因此你应该把它作为一个列表:

    Concept.objects.filter(id__in=list(Concept.objects.all().values('category')))
    

    但请注意,这可能会遇到一些数据库限制 - 例如,Oracle 允许此类列表中最多包含 1000 个元素。

    【讨论】:

    • 感谢您的深入解释!
    【解决方案2】:

    这样的事情怎么样:

    concepts = Concept.objects.exclude(category=None)
    

    【讨论】:

    • 但是 category 不是 None 对于没有子项的概念,您的查询将给出未分类的概念(概念和类别本质上是相同的实体)
    【解决方案3】:

    您在此处编写它的方式需要category 的值。一旦你解决了这个问题(在字段构造函数中使用null=True),使用这个:

    Concept.objects.filter(category__isnull=False)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 2015-05-23
      • 2022-10-29
      相关资源
      最近更新 更多