2016-04-16 6 views
0
class Person(models.Model): 
    age = models.IntegerField() 

class Group(models.Model): 
    people = models.ManyToManyField(Person,through=Membership) 

class Membership(models.Model): 
    person = models.ForeignKey(Person) 
    group = models.ForeignKey(Group) 
    existing = models.BooleanField() 

これは簡略化されたクラス構造であり、私が照会したいのは次のとおりです。 existingというメンバーシップを持つ人がいるようなグループのクエリーセットです。 私はGroup.objects.filter(membership__existing=True)を使用しようとしましたが、それはすべてのグループをつかんでいるようです。djangoのいくつかのプロパティとの関係を通じてManyToManyをクエリする方法は?

クエリーセットを除外する最も効率的な方法は何ですか?

答えて

0

モデル定義を使用してサンプルアプリケーションを作成しました。指定したフィルタがうまく動作します。 peopleフィールドのthrough属性を文字列に変更する必要がありました。Membershipはまだ定義されていません。テストを簡単にするために、Groupに名前欄を追加しました。

コンソールで次に
class Person(models.Model): 
    age = models.IntegerField() 

class Group(models.Model): 
    name = models.CharField(max_length=255) 
    people = models.ManyToManyField(Person, through='Membership') 

class Membership(models.Model): 
    person = models.ForeignKey(Person) 
    group = models.ForeignKey(Group) 
    existing = models.BooleanField() 

>>> p1 = Person.objects.create(age=10) 
>>> p2 = Person.objects.create(age=20) 
>>> has_existing = Group.objects.create(name='has_existing') 
>>> has_non_existing = Group.objects.create(name='has_non_existing') 
>>> has_none = Group.objects.create(name='has_none') 
>>> Membership.objects.create(person=p1, group=has_existing, existing=True) 
>>> Membership.objects.create(person=p2, group=has_non_existing, existing=False) 
>>> existing = Group.objects.filter(membership__existing=True) 
>>> assert(len(existing) == 1) 
>>> assert(existing[0].name == 'has_existing') 
+0

はコメントありがとうございました。私は再びテストし、私の実際のコードは 'NullBooleanField'を使用していることに気付きました。私が望む条件はnullです。だから私は 'filter(membership__existing__isnull = True)'を使用しました。これにはメンバーシップのないものも含まれます。 'filter(membership__isnull = False、membership__existing__isnull = True)'に変更してもうまく動作します。 –

関連する問題