Django查询选择具有非零子项的父项

时间:2010-04-12 16:04:54

标签: django hierarchical-data django-queryset

我有一个带有外键的模型,就像这样:

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

但我无法弄清楚如何选择具有非零儿童价值的所有概念。这是可能的django QuerySet API还是我必须编写自定义SQL?

3 个答案:

答案 0 :(得分:3)

如果我理解正确,则每个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个元素。

答案 1 :(得分:2)

这样的事情怎么样:

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

答案 2 :(得分:2)

你在那里写的方式需要category的值。修复后(在字段构造函数中使用null=True),请使用:

Concept.objects.filter(category__isnull=False)