through queryset one many example python django django-models many-to-many django-orm

python - queryset - Django filtra de muchos a muchos con contiene



django one to many (4)

El enfoque más simple para lograr esto sería verificar la igualdad en toda la instancia (en lugar de la id) en ManyToManyField . Eso se ve si la instancia está dentro de la relación de muchos a muchos. Ejemplo:

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

Estoy tratando de filtrar un montón de objetos a través de una relación de muchos a muchos. Como el campo trigger_roles puede contener múltiples entradas, probé el filtro contiene. Pero como eso está diseñado para ser usado con cadenas, estoy bastante indefenso sobre cómo debería filtrar esta relación (puede ignorar la lista values_list () atm).

Esta función se adjunta al perfil de usuario:

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)

Mi modelo de flujo de trabajo se ve así (simplificado):

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)

Aunque la solución podría ser tranquila y simple, mi cerebro no me lo dirá.

Gracias por tu ayuda.


Has intentado algo como ésto:

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

o simplemente si self.role.id no es una lista de pks:

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


Sé que esta es una vieja pregunta, pero parece que el OP nunca obtuvo la respuesta que estaba buscando. Si tiene dos conjuntos de ManyToManyFields que desea comparar, el truco es usar el operador __in , no contains . Entonces, por ejemplo, si tiene un modelo de "Evento" con ManyToMany para "Grupo" en eventgroups campo, y su modelo de Usuario (obviamente) se adjunta a Grupo, puede realizar consultas de esta manera:

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


la singularidad es casi correcta con el primer ejemplo. Solo necesitas asegurarte de que sea una lista. El segundo ejemplo, verificando trigger_roles__id__exact es una mejor solución.

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