我有这样一个带有外键的模型:
class Concept(models.Model):
name = models.CharField(max_length=200)
category = models.ForeignKey('self')
但是我不知道如何选择所有具有非零子代值的概念。 django QuerySet API是否可能这样做,或者我必须编写自定义SQL?
最佳答案
如果我理解正确,则每个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个元素。