Ich versuche, eine Reihe von Objekten durch eine Viele-zu-Viele-Beziehung zu filtern. Da das trigger_roles
Feld mehrere Einträge enthalten kann, habe ich den contains
Filter ausprobiert . Aber da das für die Verwendung mit Strings ausgelegt ist, bin ich ziemlich hilflos, wie ich diese Beziehung filtern soll (Sie können die values_list()
atm ignorieren .).
Diese Funktion ist an das Benutzerprofil angehängt:
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)
Mein Workflow-Modell sieht folgendermaßen aus (vereinfacht):
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)
Obwohl die Lösung ziemlich einfach sein mag, wird mein Gehirn es mir nicht sagen.
Danke für Ihre Hilfe.
python
django
django-models
many-to-many
django-orm
Grave_Jumper
quelle
quelle
self.role.id
eine der Trigger-Rollen ist, sollte dieser Filter alle Workflows abrufen, bei denen eine der Trigger-Rollen der Wert in istself.role.id
. Grundsätzlich verhält sich dies genau wie eine "enthält" -Funktion. Es sei denn, wir vermissen alle etwas.Der einfachste Ansatz, um dies zu erreichen, wäre die Überprüfung der gesamten Instanz (anstelle der ID) auf Gleichheit in der
ManyToManyField
. Das sieht so aus, als ob sich die Instanz innerhalb der Viele-zu-Viele-Beziehung befindet. Beispiel:module.workflow_set.filter(trigger_roles=self.role, allowed=True)
quelle
Ich weiß, dass dies eine alte Frage ist, aber es sieht so aus, als hätte das OP nie die Antwort bekommen, nach der er gesucht hat. Wenn Sie zwei Sätze von ManyToManyFields haben, die Sie vergleichen möchten, besteht der Trick darin, den
__in
Operator zu verwenden, nichtcontains
. Wenn Sie beispielsweise ein "Ereignis" -Modell mit einem ManyToMany zu "Gruppe" im Feldeventgroups
haben und Ihr Benutzermodell (offensichtlich) an eine Gruppe angehängt ist, können Sie Folgendes abfragen:Event.objects.filter(eventgroups__in=u.groups.all())
quelle
Singularität ist mit dem ersten Beispiel fast richtig. Sie müssen nur sicherstellen, dass es sich um eine Liste handelt. Das zweite Beispiel, das Überprüfen,
trigger_roles__id__exact
ist jedoch eine bessere Lösung.module.workflow_set.filter(trigger_roles__in=[self.role.id],allowed=True)
quelle