2017-06-24 4 views
0

私はこのようなモデルがあります:Django ORMでこのデータを照会する最良の方法は何ですか?

class Task(models.Model): 
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='tasks_by_me') 
    assignees = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='tasks_assigned_to_me') 

を、私は取得したい「(重複なし)すべてのタスクをいずれかTheUserによって作成されたか、彼に割り当てられていました」。ここで

は、私はSQLでこれをコーディングする可能性がある方法です:

SELECT * 
FROM 
    (
    SELECT 1 AS id, 1 as created_by_id UNION ALL 
    SELECT 2 AS id, 2 as created_by_id UNION ALL 
    SELECT 3 AS id, 3 as created_by_id UNION ALL 
    SELECT 4 AS id, 2 as created_by_id 
) task 
LEFT JOIN 
    (
    SELECT 1 AS task_id, 1 AS user_id UNION ALL 
    SELECT 1 AS task_id, 2 AS user_id UNION ALL 
    SELECT 2 AS task_id, 1 AS user_id UNION ALL 
    SELECT 2 AS task_id, 2 AS user_id UNION ALL 
    SELECT 2 AS task_id, 3 AS user_id UNION ALL 
    SELECT 3 AS task_id, 3 AS user_id UNION ALL 
    SELECT 4 AS task_id, 2 AS user_id 
) task_assignees ON task_assignees.task_id = task.id AND COALESCE(task_assignees.user_id, 2) = 2 
WHERE task.created_by_id = 2 
OR task_assignees.user_id = 2; 

出力:

id created_by_id task_id  user_id 
1 1    1   2 
2 2    2   2 
4 2    4   2 

task_id=2のための唯一の1行は、それが3つの譲受人と持っているという事実にもかかわらずありますタスクは、TheUser(id=2)

によって作成されました。これらのsceを処理するためのベストプラクティスに興味がありますNarios?

答えて

0

生のSQL問合せを書く代わりに、django ormモデルを使用する場合はQuerySet APIを使用できます。以下の例は、あなたに割り当てられたタスクまたはあなたが作成したタスクがあるクエリセットを提供します。 Qは、django ormで複雑なクエリを実行するために使用されます。

from django.db.models import Q 
Task.objects.filter(Q(assignees__username='soemeusername') | Q(created_by__username='someusername')).distinct() 
+0

これは機能します。ありがとう!私が提供しているのと同じSQLを構築することが可能な場合、またはDISTINCTバージョンと比較して実質的な利点はありません。 – AlexSec

+0

ormの目的は、生のSQL問合せの複雑さからあなたを救って、上記のステートメントがあなたが言及したようなほぼ同じロジックSQLクエリに変換されたように大きな結合を実行することです。 –

関連する問題