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?
これは機能します。ありがとう!私が提供しているのと同じSQLを構築することが可能な場合、またはDISTINCTバージョンと比較して実質的な利点はありません。 – AlexSec
ormの目的は、生のSQL問合せの複雑さからあなたを救って、上記のステートメントがあなたが言及したようなほぼ同じロジックSQLクエリに変換されたように大きな結合を実行することです。 –