J'essaye de filtrer un groupe d'objets à travers une relation plusieurs-à-plusieurs. Parce que le trigger_roles
champ peut contenir plusieurs entrées, j'ai essayé le contains
filtre. Mais comme cela est conçu pour être utilisé avec des chaînes, je suis pratiquement incapable de filtrer cette relation (vous pouvez ignorer l' values_list()
atm.).
Cette fonction est attachée au profil utilisateur:
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)
Mon modèle de workflow ressemble à ceci (simplifié):
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)
Bien que la solution soit assez simple, mon cerveau ne me le dira pas.
Merci de votre aide.
python
django
django-models
many-to-many
django-orm
Grave_Jumper
la source
la source
self.role.id
est l'un des rôles de déclencheur, ce filtre doit extraire tous les flux de travail où l'un des rôles de déclencheur est la valeur dansself.role.id
. Fondamentalement, cela se comportera exactement comme une fonction "contient". À moins que nous manquions tous quelque chose.L'approche la plus simple pour y parvenir serait de vérifier l'équité sur toute l'instance (au lieu de l'id) dans le
ManyToManyField
. Cela regarde si l'instance est à l'intérieur de la relation plusieurs à plusieurs. Exemple:module.workflow_set.filter(trigger_roles=self.role, allowed=True)
la source
Je sais que c'est une vieille question, mais il semble que le PO n'ait jamais tout à fait obtenu la réponse qu'il recherchait. Si vous souhaitez comparer deux ensembles de ManyToManyFields, l'astuce consiste à utiliser l'
__in
opérateur, noncontains
. Ainsi, par exemple, si vous avez un modèle "Event" avec un champ ManyToMany à "Group" sureventgroups
, et que votre modèle User (évidemment) s'attache à Group, vous pouvez interroger comme ceci:Event.objects.filter(eventgroups__in=u.groups.all())
la source
la singularité a presque raison avec le premier exemple. Vous devez juste vous assurer que c'est une liste. Le deuxième exemple, vérifier le
trigger_roles__id__exact
est une meilleure solution cependant.module.workflow_set.filter(trigger_roles__in=[self.role.id],allowed=True)
la source