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

dra*_*oon 5 django django-queryset hierarchical-data

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

class Concept(models.Model):
    name = models.CharField(max_length=200)
    category = models.ForeignKey('self')
Run Code Online (Sandbox Code Playgroud)

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

rob*_*rob 4

如果我理解正确的话,每个人都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'))
Run Code Online (Sandbox Code Playgroud)

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

Concept.objects.filter(id__in=list(Concept.objects.all().values('category')))
Run Code Online (Sandbox Code Playgroud)

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