Saya mencoba memfilter sekumpulan objek melalui relasi banyak-ke-banyak. Karena trigger_roles
bidang mungkin berisi banyak entri, saya mencoba contains
filter. Tapi karena itu dirancang untuk digunakan dengan string, saya cukup tidak berdaya bagaimana saya harus memfilter hubungan ini (Anda dapat mengabaikan values_list()
atm.).
Fungsi ini dilampirkan ke profil pengguna:
def getVisiblePackages(self):
visiblePackages = {}
for product in self.products.all():
moduleDict = {}
for module in product.module_set.all():
pkgList = []
involvedStatus = module.workflow_set.filter(trigger_roles__contains=self.role.id,allowed=True).values_list('current_state', flat=True)
Model alur kerja saya terlihat seperti ini (disederhanakan):
class Workflow(models.Model):
module = models.ForeignKey(Module)
current_state = models.ForeignKey(Status)
next_state = models.ForeignKey(Status)
allowed = models.BooleanField(default=False)
involved_roles = models.ManyToManyField(Role, blank=True, null=True)
trigger_roles = models.ManyToManyField(Role, blank=True, null=True)
Meskipun solusinya mungkin cukup sederhana, otak saya tidak akan memberi tahu saya.
Terima kasih atas bantuan Anda.
python
django
django-models
many-to-many
django-orm
Grave_Jumper
sumber
sumber
self.role.id
adalah salah satu peran pemicu, filter tersebut harus menarik semua alur kerja yang salah satu peran pemicunya adalah nilai tersebutself.role.id
. Pada dasarnya ini akan berperilaku persis seperti fungsi "berisi". Kecuali kita semua melewatkan sesuatu.Pendekatan paling sederhana untuk mencapai ini adalah memeriksa persamaan di seluruh instance (bukan id) di
ManyToManyField
. Itu terlihat jika instance berada di dalam hubungan banyak ke banyak. Contoh:module.workflow_set.filter(trigger_roles=self.role, allowed=True)
sumber
Saya tahu ini adalah pertanyaan lama, tapi sepertinya OP tidak pernah mendapatkan jawaban yang dia cari. Jika Anda memiliki dua set ManyToManyFields yang ingin Anda bandingkan, triknya adalah menggunakan
__in
operatornya, bukancontains
. Jadi misalnya jika Anda memiliki model "Peristiwa" dengan bidang ManyToMany ke "Grup"eventgroups
, dan model Pengguna Anda (jelas) melampirkan ke Grup, Anda dapat membuat kueri seperti ini:Event.objects.filter(eventgroups__in=u.groups.all())
sumber
singularitas hampir benar dengan contoh pertama. Anda hanya perlu memastikan bahwa itu adalah daftar. Contoh kedua, memeriksa
trigger_roles__id__exact
adalah solusi yang lebih baik.module.workflow_set.filter(trigger_roles__in=[self.role.id],allowed=True)
sumber