我目前正在将服务器从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。
答案 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加入通常只能通过外键或许多领域。