Python Django反向引用上的过滤
我试图查询表中的所有对象,而不从另一个模型进行反向引用Python Django反向引用上的过滤,python,django,django-queryset,Python,Django,Django Queryset,我试图查询表中的所有对象,而不从另一个模型进行反向引用 class A(models.Model): pass class B(models.Model): reference = models.ForeignKey(A) 为了获得没有任何B对象引用的所有A对象,我需要 A.objects.filter(b__isnull=True) 报告根本没有提到反向引用 我会遇到麻烦吗?或者它只是缺乏文档记录?我在Django 1.10.3中使用了相同的代码示例 让我们看看Djang
class A(models.Model):
pass
class B(models.Model):
reference = models.ForeignKey(A)
为了获得没有任何B
对象引用的所有A
对象,我需要
A.objects.filter(b__isnull=True)
报告根本没有提到反向引用
我会遇到麻烦吗?或者它只是缺乏文档记录?我在Django 1.10.3中使用了相同的代码示例 让我们看看Django创建的原始SQL语句:
>>> print(A.objects.filter(b__isnull=True).query)
SELECT "backrefs_a"."id" FROM "backrefs_a" LEFT OUTER JOIN "backrefs_b" ON ("backrefs_a"."id" = "backrefs_b"."reference_id") WHERE "backrefs_b"."id" IS NULL
从技术上讲,这与Django将发送到数据库的SQL并不完全相同,但已经足够接近了。有关更多讨论,请参阅
如果我们对其进行一些修饰,您可以看到该查询实际上是非常安全的:
SELECT "backrefs_a"."id"
FROM "backrefs_a"
LEFT OUTER JOIN "backrefs_b" ON ("backrefs_a"."id" = "backrefs_b"."reference_id")
WHERE "backrefs_b"."id" IS NULL
左外部联接中的左
确保您将从A获取记录,即使B中没有匹配的记录。而且,由于Django不会使用NULL
id来保存B,您可以放心,它将按预期工作。我想不出一个不起作用的原因,似乎表明这是正确的