为了使我的问题更容易理解,这是一个例子。
有两种型号:
class A(models.Model):
name = models.CharField(max_length = 10)
class B(models.Model):
a = models.ForeignKey(A)
name = models.CharField(max_length = 10)
所以在这个例子中,A和B是一对多的关系。现在让我们说我想做出以下查询:找到一个至少有一个B作为孩子的A.在sql中,显然我应该使用exists子句。是否有可能与orm完全相同?
我已经对此做了一些研究,但无法找到与sql查询的完美匹配。最接近的解决方案如下:
A.objects.filter(b__pk__gt = 0).distinct()
但是它仍然远离sql中的exists子句,可能没有现有效率。
答案 0 :(得分:1)
以下内容将选择包含一个或多个关联A
的所有B
:
A.objects.filter(b__isnull=False)
将其切换为b__isnull=True
只会选择与A
无关联的B
。
答案 1 :(得分:1)
实际上(如果我没有被误解你正在尝试做什么)使用普通的SQL,一个简单的左连接将是一种方式而不是EXISTING子句。
您的查询集在没有.distinct()
的情况下工作正常我建议你看一下django orm生成的查询,这样你就可以看到正在发生的事情并且实际运行ANALYZE / EXPLAIN而不是猜测性能。
您可以从查询集的查询属性中查看原始查询,或者更好的是,安装django调试工具栏并查看给定请求的所有查询。