Saya ingin filter model Django yang terhubung ke model kedua melalui hubungan antara banyak-ke-banyak.

class Person(models.Model):
    name = models.CharField(max_length=128)

    def __unicode__(self):
        return self.name

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

    def __unicode__(self):
        return self.name

class Membership(models.Model):
    person = models.ForeignKey(Person)
    group = models.ForeignKey(Group)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)

desain dan hasil yang diharapkan

Hasilnya harus memilih hanya Orang A karena dia terhubung ke Grup dengan entri 1 DAN 2 melalui keanggotaan. Saya ingin menggunakan objek Q untuk tugas semacam ini.

Adakah yang bisa memberi saya petunjuk?

0
essin 14 Agustus 2017, 15:15

2 jawaban

Jawaban Terbaik

Saya pikir Anda ingin semua objek Person yang ada di semua ID grup yang akan Anda berikan.

Solusi:

from django.db.models import Q

person_qs = Person.objects.exclude(~(Q(group__id=1) & Q(group__id=2)))

Di sini, saya menggunakan exclude untuk mengecualikan semua ID grup yang bukan 1 dan 2.

Jika Anda memiliki banyak ID grup, Anda dapat menggunakan reduce dan operator untuk membuat kueri dalam satu for-loop.

from functools import reduce
import operator

query = reduce(operator.and_, (Q(group__id=group_id) for group_id in group_ids))

persons_qs = Person.objects.exclude(~query)

Ini, akan membentuk kueri seperti Q(group__id=1) & Q(group_id=2) & (seterusnya...)

3
Sachin 14 Agustus 2017, 14:42

Tidak perlu menggunakan Q di sini, ini adalah kueri sederhana.

Person.objects.filter(group__id__in=[1, 2])
3
Daniel Roseman 14 Agustus 2017, 12:19