Saya punya model:
class Zone(models.Model):
name = models.CharField(max_length=128)
users = models.ManyToManyField(User, related_name='zones', null=True, blank=True)
Dan saya perlu membuat filter di sepanjang baris:
u = User.objects.filter(...zones contains a particular zone...)
Itu harus menjadi filter pada Pengguna dan itu harus menjadi parameter filter tunggal. Alasannya adalah karena saya membuat querystring URL untuk memfilter daftar pengguna admin:http://myserver/admin/auth/user/?zones=3
Sepertinya itu harus sederhana tetapi otakku tidak mau bekerja sama!
django
django-models
Andy Baker
sumber
sumber
User.objects.filter(zones__id=<id>)
atau tidakUser.objects.filter(zones__in=<id(s)>)
baik untuk ini?User.objects.filter(zones__in=<id(s)>)
mungkin seharusnyaUser.objects.filter(zones__id__in=<id(s)>)
Jawaban:
Hanya mengulangi apa yang dikatakan Tomasz.
Ada banyak contoh
FOO__in=...
filter gaya dalam pengujian banyak-ke-banyak dan banyak-ke-satu . Berikut ini sintaks untuk masalah spesifik Anda:Sintaks garis bawah ganda (__) digunakan di semua tempat ketika bekerja dengan kueri .
sumber
...__in
contoh setelahnya# filtering on a few zones, by id
. Itu menunjukkan penyaringan untuk beberapa id / objek (dalam hal ini). Cukup kirimkan id / objek zone1, zone3, dan zone10 yang Anda pedulikan. Atau tambahkan 4 jika perlu.Perhatikan bahwa jika pengguna mungkin berada di beberapa zona yang digunakan dalam kueri, Anda mungkin ingin menambahkan .distinct (). Kalau tidak, Anda mendapatkan satu pengguna beberapa kali:
sumber
Cara lain untuk melakukan ini adalah dengan melalui tabel perantara. Saya akan menyatakan ini dalam Django ORM seperti ini:
akan lebih baik jika tidak membutuhkan yang
.values('user')
ditentukan, tetapi Django (versi 3.0.7) tampaknya membutuhkannya.kode di atas akan menghasilkan SQL yang terlihat seperti:
yang bagus karena tidak memiliki gabungan antara yang dapat menyebabkan pengguna duplikat dikembalikan
sumber