2011-02-04 14 views
1

私は論文のモデルを持っている:複雑なDjangoのクエリ

class Person(models.Model): 
    position = models.CharField(max_length=64) 
    group = models.ForeignKey('Group') 

class Group(models.Model): 
    ... 

今、私は私に、各グループ内のすべての者が位置労働者を持っているすべての個別Groupをお返ししますクエリをしたいです。だから私はそれらの中に労働者だけを持つすべてのグループを持つでしょう。どうやってするか?

私が使用を開始:

groups = Group.objects.filter(person__position='worker').distinct() 

しかし、これで私は労働者でない者を持っているグループがあります。

例えば、私のクエリは、グループ1を返すはずですがないグループ2:http://docs.djangoproject.com/en/dev/topics/db/aggregation/

が、私は正確な構文を思い出すことはできませんが、それぞれに注釈を付けることができる必要があります:注釈に

group1 
    person1 -> position=worker 
    person2 -> position=worker 
    person3 -> position=worker 

group2 
    person4 -> position=worker 
    person5 -> position=looser 
    person6 -> position=sleeper 
+0

「グループ」モデルは、「位置」が「ワーカー」と等しいだけで、他の値はないことを意味しますか? –

+0

まさに!私は私の質問に、より明確な例を加えました。 – Etienne

答えて

2

これは動作するはずです:

Group.objects.exclude(~Q(person__position="worker")) 

編集:

上記はので、ここでは正しくありませんでしたが、私の2回目の試行です:

Group.objects.filter(
    Q(person__position="worker") 
    & ~Q(person__position__gt="worker") 
    & ~Q(person__position__lt="worker") 
) 

これを使用することができる場合、私はわかりませんよすべてのデータベースと私のPGSQLインストールで動作します。

+0

残念ながら、これは動作しません。これは 'Group.objects.filter(person__position =" worker ")'とほとんど同じです。なぜなら、 'exclude 'のNOTは'〜Q'のNOTをキャンセルするからです。どちらのクエリでも同じ結果が得られます。 – Etienne

+0

あなたは正しいです、私は私の答えを編集しました – XORcist

+0

ああ、素敵!本当に面白いアプローチ。私はそれを試して、それは動作します!私はそれを私の実際のモデルに適応させる必要があります(私の例よりはるかに複雑です)。しかし、私はそれがうまくいくと確信しています。私の実際のモデルでは 'Q'クエリの中で' id'を使うことができるので、 'lt'と' gt'は確実に動作します。ありがとう。 – Etienne

0

ルックposition = "worker"の人数とPersonの総数をグループ化し、それらの2つのカウントが等しいグループのみにフィルタリングします。

+0

あなたの考えは良いようですが、残念ながら私はそれを実装することができません。私はそれを書く正しい方法を見つけることができません。実際には、私はSQLでこれを直接解決しようとしましたが、私はこの方法ではできません... – Etienne