首页 > 解决方案 > Django 如何在 LEFT JOIN 中传递子查询

问题描述

我有 3 个模型(A、B、C):

class A(models.Model):

url = models.URLField()
uuid = models.UUIDField()
name = models.CharField(max_length=400)
id = models.IntegerField()

class B(models.Model):

user = models.ForeignKey(C, to_field='user_id',
                         on_delete=models.PROTECT,)
uuid = models.ForeignKey(A, to_field='uuid',
                         on_delete=models.PROTECT,)

我想使用 Django ORM 执行以下 SQL 查询:

SELECT A.id, COUNT(A.id), COUNT(foo.user)

FROM A

LEFT JOIN (SELECT uuid, user FROM B where user = '<a_specific_user_id>') as foo
  ON A.uuid = foo.uuid_id 
  
WHERE name = '{}'

GROUP by 1

HAVING COUNT(A.id)> 1 AND COUNT(A.id)>COUNT(foo.user)

我的问题主要是 LEFT JOIN。我知道我可以LEFT JOIN通过检查null表 B 上是否存在字段来形成 a:

A.objects.filter(name='{}', b__isnull=True).values('id', 'name')

但我怎样才能LEFT JOIN对我想要的特定子查询?

我尝试使用Subquery(),但它似乎填充了最终WHERE语句,并且没有在LEFT JOIN.

标签: djangodjango-models

解决方案


对于将来偶然发现此问题的任何人。LEFT JOIN我直接联系了 Django irc 频道,并确认到目前为止,使用 Django ORM在子句中包含自定义子查询是不可能的。


推荐阅读