web-dev-qa-db-ja.com

Django ManyToMany filter()

私にはモデルがあります:

class Zone(models.Model):
    name = models.CharField(max_length=128)
    users = models.ManyToManyField(User, related_name='zones', null=True, blank=True)

そして、私は次の行に沿ってフィルターを構築する必要があります:

u = User.objects.filter(...zones contains a particular zone...)

これは、ユーザーのフィルターである必要があり、単一のフィルターパラメーターである必要があります。これは、管理ユーザーのチェンジリストをフィルタリングするためのURLクエリ文字列を作成しているためです:http://myserver/admin/auth/user/?zones=3

簡単なはずですが、私の脳は協力していません!

103
Andy Baker

トマスが言ったことを言い直します。

多対多 および 多対一 テストのFOO__in=...スタイルフィルターの例は多数あります。特定の問題の構文は次のとおりです。

users_in_1zone = User.objects.filter(zones__id=<id1>)
# same thing but using in
users_in_1zone = User.objects.filter(zones__in=[<id1>])

# filtering on a few zones, by id
users_in_zones = User.objects.filter(zones__in=[<id1>, <id2>, <id3>])
# and by zone object (object gets converted to pk under the covers)
users_in_zones = User.objects.filter(zones__in=[zone1, zone2, zone3])

querysets を使用する場合は、二重アンダースコア(__)構文が至る所で使用されます。

124
istruble

ユーザーがクエリで使用される複数のゾーンにいる場合は、おそらく.distinct()を追加する必要があることに注意してください。それ以外の場合は、1人のユーザーを複数回取得します。

users_in_zones = User.objects.filter(zones__in=[zone1, zone2, zone3]).distinct()
24
QB.