Estoy tratando de filtrar un montón de objetos a través de una relación 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).Django filter many-to-many with contains
Esta función está unida 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 parece a esto (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 estar en silencio simple, mi cerebro no lo hará Dime.
Gracias por su ayuda.
Eso no lo hace parece que funciona Como self.role.id es solo una int y la trigger_roles es una lista de ellas, necesitaría una entrada invertida, como contiene, pero como he descubierto, contiene solo para cadenas. –
El segundo ejemplo * debería * funcionar. Si el valor en 'self.role.id' es uno de los roles desencadenantes, ese filtro debe extraer todos los flujos de trabajo donde uno de los roles de desencadenante es el valor en' self.role.id'. Básicamente, esto se comportará exactamente como una función "contiene". A menos que nos estemos perdiendo algo. –
@Jordan Reiter: "contiene" se convierte en sql a "me gusta", que no es lo que quiere el OP y creo que ya lo señala, en cambio, "exacto" se convierte en "=" o "es", que es la idea aquí. – mouad