2011-10-25 10 views
51

私のmodels.pyに次のようなものがあるとします:DjangoはManyToManyカウントでモデルをフィルタリングしますか?

class Hipster(models.Model): 
    name = CharField(max_length=50) 

class Party(models.Model): 
    organiser = models.ForeignKey() 
    participants = models.ManyToManyField(Profile, related_name="participants") 

今、私のviews.pyには、参加者が0人以上いるユーザーのためのパーティーをフェッチするクエリを実行したいと考えています。

多分このようなものがあります:

user = Hipster.get(pk=1) 
hip_parties = Party.objects.filter(organiser=user, len(participants) > 0) 

それを行う最良の方法は何ですか?

+21

+1 'Hipster'オブジェクトを作成するためだけです。面白すぎる。 – jathanism

+2

+1偉大な授業のためだけでなく、簡潔な質問... – bhell

答えて

92

これが動作すれば、私はそれをやります。

最良の方法は、最高のパフォーマンス、最も保守的なものなどを意味することができます。したがって、私はこれが最良の方法であるとは言いませんが、より保守性が高いので、 。 exclude

from django.db.models import Count 

user = Hipster.objects.get(pk=1) 
hip_parties = (Party.objects.annotate(num_participants=Count('participants')) 
          .filter(organiser=user, num_participants__gt=0)) 
+0

これは、選択された答えとして簡潔ではないが、これを行う別の良い方法です。 – jathanism

+11

+1、 "Y以上"、 "X未満"はここですべてカバーされています。実際に質問に答えたヌルだけでなく、 "DjangoはManyToManyカウントでモデルをフィルタリングします" –

+3

これは本当に受け入れられる答えです。 – gregoltsov

28
Party.objects.filter(organizer=user, participants__isnull=False) 
Party.objects.filter(organizer=user, participants=None) 
+0

私はこれが最も優雅なソリューションだとは思わないが、私の場合はうまくいく。私はそれをやるための元気なやり方があるかどうかまだ見ています。 – Ska

+0

このソリューションについては何が優雅ではありませんか?それはまさにあなたが求めていたものです! :)それは答えから完全にはっきりとは分かりませんが、どちらか一方を使用するのではなく両方を使用します。同じ問題に対する2つのアプローチ。 – jathanism

+0

数字を直接参照することができれば、もっとエレガントになります。 nullはlen()== 0と同じではないか、何か不足していますか? – Ska

3

簡単:雄二-'Tomita' - 富田の答え@由来

# organized by user and has more than 0 participants 
Party.objects.filter(organizer=user).exclude(participants=None) 

また返す明確な結果

0

は、私はまた、「(.distinctを追加しましたid ')、重複レコードを除外する。

Party.objects.filter(organizer=user, participants__isnull=False).distinct('id') 

したがって、各当事者は1回だけリストされます。

関連する問題