0

プロジェクトとアクションの 2 つのモデルがあります。

class Project(models.Model):
    name = models.CharField("Project Name", max_length=200, unique = True)

class Action(models.Model):
    name = models.CharField("Action Name", max_length=200)
    project = models.ForeignKey(Project, blank=True, null=True, verbose_name="Project")
    notes = models.TextField("Notes", blank=True)
    complete = models.BooleanField(default=False, verbose_name="Complete?")
    status = models.IntegerField("Action Status", choices = STATUS, default=0)

ステータスが 2 未満のアクションがないすべてのプロジェクトを返すクエリが必要です。

私は試した:

Project.objects.filter(action__status__gt = 1)

ただし、これはすべてのプロジェクトを返します。これは、各プロジェクトにステータス 2 のアクションとステータス 2 未満のアクションがあるためです。また、結果のクエリでプロジェクトが繰り返されます。私の現在の解決策は以下の通りです:

Project.objects.filter(action__status__gt =1).exclude(action__status__lt =2).annotate()

これにより、繰り返し結果が折りたたまれ、アクション ステータスが 1 より大きいアクションのみが表示されます。しかし、これはそのようなクエリを作成する正しい方法でしょうか? アクション ステータスが 1 より大きいプロジェクト、またはアクションのないプロジェクトを返したい場合はどうすればよいですか?

4

2 に答える 2

0

私はあなたの要件を誤解しているかもしれませんが、注釈を使用してそれを行うことができると思います。

Project.objects.annotate(m = Min('action__status')).filter(Q(m = None) | Q(m__gt = 1))

生成される SQL は次のとおりです。

SELECT
    "testapp_project"."id", "testapp_project"."name", 
    MIN("testapp_action"."status") AS "m" 
FROM "testapp_project" 
LEFT OUTER JOIN "testapp_action" ON ("testapp_project"."id" = "testapp_action"."project_id") 
GROUP BY "testapp_project"."id", "testapp_project"."name" 
HAVING(
       MIN("testapp_action"."status") IS NULL 
    OR MIN("testapp_action"."status") > 1 
)

これはかなり自明です。

于 2012-10-20T23:05:43.147 に答える
0

Django の ORM はこれを表現できません。これを実行するには、生のクエリを使用する必要があります。

于 2012-10-20T15:13:24.313 に答える