【问题标题】:Using the Django ORM to join on the same table使用 Django ORM 加入同一张表
【发布时间】:2017-01-03 17:39:21
【问题描述】:

我目前正在将我们的服务器从 Java 切换到 Python (Django),并且正在使用 ORM 重新创建我们的 SQL 查询,其中一个被证明是困难的,因为我需要加入同一张表。以下是查询

SELECT  U1.suser, COUNT(U1.id) FROM United U1 INNER JOIN United U2 ON 
U1.sUser = U2.pUser WHERE U2.sUser IN (select sUser from united where pUser = '105660') 
and U1.pUser = '105660' and U1.sUser IN ('580664','1015396') GROUP BY U1.id, U1.suser

这是我的模型:

class United(models.Model):
id = models.IntegerField(primary_key=True)
puser = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, db_column='puser')
suser = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, db_column='suser',
                          related_name='secondary_united')
date = models.DateTimeField(max_length=34, blank=True, null=True, auto_now_add=True)

class Meta:
    db_table = 'United'
    unique_together = (('puser', 'suser'),)

该查询旨在查找我自己(主叫用户)和他们所有朋友(ID 列表)之间的相互连接数

查询按我希望的方式工作,以使用直接 SQL(尽管由于此主键错误,我无法使用 .raw() 方法使其工作

django.db.models.query_utils.InvalidQuery: Raw query must include the primary key

但我想找到一种使用 ORM 的方法。

【问题讨论】:

  • 抱歉@e4c5 添加到错误中

标签: python sql sql-server django orm


【解决方案1】:

我假设您尝试将查询调用为

United.objects.raw(sql)

正如您提到的那样,这确实会产生错误,因为您的投影U1.suser, COUNT(U1.id) 没有 id 列。您需要将其更改为类似的内容

SELECT U1.id, U1.suser, COUNT(U1.id) FROM United U1 INNER JOIN United U2 ON 
U1.sUser = U2.pUser WHERE U2.sUser IN (select sUser from united where pUser = '105660') 
and U1.pUser = '105660' and U1.sUser IN ('580664','1015396') GROUP BY U1.id, U1.suser

请注意,它必须是 U1.id 而不是 U2.id,因为您在 U1.id 上分组

诚然,使用 ORM 编写此查询有点困难。由于您将 United 加入到自身中,而 django ORM 连接通常仅通过外键或多对多字段进行。

【讨论】:

  • 好吧,这行得通...因为我认为这会导致我几乎肯定我已经在选择字段中使用 U1.id 进行了尝试,但我想我没有。谢谢!
  • 我们去!赞成并检查为已接受的答案。
猜你喜欢
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多