我有一个带有外键的模型,就像这样:
class Concept(models.Model):
name = models.CharField(max_length=200)
category = models.ForeignKey('self')
但我无法弄清楚如何选择具有非零儿童价值的所有概念。这是可能的django QuerySet API还是我必须编写自定义SQL?
答案 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)