2017-01-03 12 views
2

私は現在、私たちのサーバーをJavaからPython(Django)に切り替えており、ORMを使用してSQLクエリを再作成しています。同じテーブル。以下は、クエリDjango ORMを使用して同じテーブルに結合する

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

申し訳ありません@ e4c5がエラーに追加されました –

答えて

1

私はあなたが言及としてあなた投影U1.suser, COUNT(U1.id)は、id列にそれを持っていないため、実際のエラーを生成する

United.objects.raw(sql) 

としてクエリを起動しようとしたことを前提としています。あなたはU1.id

にグループ分けされているので、それは確かにこのクエリはORMを使用して書くことが少し難しいだろうU1.idないU2.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 

ノートのようなものに変更する必要があります。あなた自身がUnitedに参加しているため、djangoのORM結合は、通常、外部キーまたは多くのフィールドだけを介してのみ行われます。

+0

それはうまくいきました...私はそれが私がほぼポジティブだったと思ったので、私は選択フィールドでU1.idで試しましたが、私はしなかったと思います。 ありがとうございました! –

+0

そこに行く! UpvotedとAccepted Answerとしてチェックされました。 –

+0

ありがとうたくさんの私の+1 – e4c5

関連する問題