Django:是否有可能实现与sql存在相同的东西?

时间:2012-03-19 20:26:32

标签: python django

为了使我的问题更容易理解,这是一个例子。

有两种型号:

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子句,可能没有现有效率。

2 个答案:

答案 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调试工具栏并查看给定请求的所有查询。