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

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个元素。

09-26 17:33