使用Django ORM加入同一个表

时间:2017-01-03 17:39:21

标签: python sql sql-server django orm

我目前正在将服务器从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。

1 个答案:

答案 0 :(得分: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加入通常只能通过外键或许多领域。