Django filtre plusieurs-à-plusieurs avec contient

J’essaie de filtrer un tas d’objects à travers une relation plusieurs-à-plusieurs. Comme le champ sortinggger_roles peut contenir plusieurs entrées, j’ai essayé le filtre contient. Mais comme cela est conçu pour être utilisé avec des chaînes, je suis pratiquement incapable de filtrer cette relation (vous pouvez ignorer la valeur_list () atm.).

Cette fonction est associé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(sortinggger_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) sortinggger_roles = models.ManyToManyField(Role, blank=True, null=True) 

Bien que la solution puisse être simple, mon cerveau ne me le dira pas.

Merci de votre aide.

Avez-vous essayé quelque chose comme ça:

 module.workflow_set.filter(sortinggger_roles__in=[self.role], allowed=True) 

ou simplement si self.role.id n’est pas une liste de points:

 module.workflow_set.filter(sortinggger_roles__id__exact=self.role.id, allowed=True) 

L’approche la plus simple pour y parvenir serait de vérifier l’égalité entre l’instance entière (au lieu de l’ID) dans le ManyToManyField . Cela regarde si l’instance est dans la relation plusieurs à plusieurs. Exemple:

 module.workflow_set.filter(sortinggger_roles=self.role, allowed=True) 

la singularité a presque raison avec le premier exemple. Vous devez juste vous assurer que c’est une liste. Le deuxième exemple, la vérification de sortinggger_roles__id__exact est une meilleure solution.

 module.workflow_set.filter(sortinggger_roles__in=[self.role.id],allowed=True) 

Je sais que c’est une vieille question, mais il semble que l’OP n’a jamais vraiment eu la réponse qu’il cherchait. Si vous souhaitez comparer deux ensembles de ManyToManyFields, l’astuce consiste à utiliser l’opérateur __in , pas à contains . Ainsi, par exemple, si vous avez un modèle “Event” avec un ManyToMany à “Grouper” sur des eventgroups champ, et que votre modèle d’utilisateur (évidemment) se joint au groupe, vous pouvez interroger comme ceci:

Event.objects.filter(eventgroups__in=u.groups.all())