2016-08-31 7 views
0

私はこのクエリのdjangoバージョンを思いつきましたが、私はそれを得ることができません。複数の結合を使ったDjango ORMクエリ

SELECT 
    * 
FROM answer a 
LEFT JOIN groups g 
    ON a.group_id = g.id 
LEFT JOIN group_permissions gp 
    ON g.id = gp.group_id 
WHERE gp.user_id = '77777'; 

私はこのような何かをしようとしてきた:

answers = Answer.objects.filter(user_id=user_id).prefetch_related('group__grouppermissions') 

回答は、グループに関連付けられています。グループは複数のユーザーに関連付けられています。グループのアクセス許可は、グループとユーザーに関連付けられています。

私はどこかの関係を失っていると確信しています。

モデル:

class User(models.Model): 
    id = models.BigAutoField(primary_key=True) 
    username = models.CharField(max_length=255) 

class Answer(models.Model): 
    id = models.BigAutoField(primary_key=True) 
    user = models.ForeignKey('User', models.DO_NOTHING) 
    group = models.ForeignKey('Groups', models.DO_NOTHING) 
    class Meta: 
     managed = False 
     db_table = 'answer' 

class Groups(models.Model): 
    id = models.BigAutoField(primary_key=True) 
    name = models.CharField(unique=True, max_length=255) 

    class Meta: 
     managed = False 
     db_table = 'groups' 

class GroupPermissions(models.Model): 
    id = models.BigAutoField(primary_key=True) 
    group = models.ForeignKey('Groups', models.DO_NOTHING) 
    user = models.ForeignKey('User', models.DO_NOTHING) 
    role = models.IntegerField() 

    class Meta: 
     managed = False 
     db_table = 'group_permissions' 
+0

回答はグループに関連付けられていません。モデルはどのように定義されていますか? – karthikr

+0

回答はグループに関連付けられています。 Answerは、group:id(pk)にマップするグループid(外部キー)を持っています。 – dimxasnewfrozen

答えて

0

暗黙の関連付けジャンゴがあなたのために作成されますがあります:group_grouppermissions_set。多対1の関係についてはdocsで読むことができます。

だからあなたのクエリは次のようなもののようになります。

answers = Answer.objects.\ 
    filter(group__grouppermissions_set__user_id=77777) 

また、DjangoはLEFT OUTER JOINを作成することに注意してください。

次に、クエリが機能していると確信するときは、prefetch_relatedのような最適化を同様のルックアップで追加できます。それはAnswerモデルからどれくらい深く取り込みたいかによって異なります。

関連する問題