Estou tentando filtrar um monte de objetos por meio de uma relação muitos para muitos. Como o trigger_roles
campo pode conter várias entradas, experimentei o contains
filtro. Mas, como isso foi projetado para ser usado com cordas, não tenho como saber como filtrar essa relação (você pode ignorar o values_list()
atm.).
Esta função está anexada ao perfil do usuário:
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)
Meu modelo de fluxo de trabalho é assim (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)
Embora a solução possa ser bem simples, meu cérebro não me diz.
Obrigado pela ajuda.
python
django
django-models
many-to-many
django-orm
Grave_Jumper
fonte
fonte
self.role.id
for uma das funções do acionador, esse filtro deve puxar todos os fluxos de trabalho em que uma das funções do acionador é o valor emself.role.id
. Basicamente, isso se comportará exatamente como uma função "contém". A menos que todos estejamos perdendo alguma coisa.A abordagem mais simples para conseguir isso seria verificar a igualdade em toda a instância (em vez do id) no
ManyToManyField
. Parece que a instância está dentro do relacionamento muitos para muitos. Exemplo:module.workflow_set.filter(trigger_roles=self.role, allowed=True)
fonte
Sei que essa é uma pergunta antiga, mas parece que o OP nunca obteve a resposta que estava procurando. Se você tiver dois conjuntos de ManyToManyFields que deseja comparar, o truque é usar o
__in
operador, nãocontains
. Então, por exemplo, se você tiver um modelo de "Evento" com um ManyToMany para "Grupo" no campoeventgroups
, e seu modelo de Usuário (obviamente) anexar ao Grupo, você pode consultar desta forma:Event.objects.filter(eventgroups__in=u.groups.all())
fonte
a singularidade está quase certa com o primeiro exemplo. Você só precisa ter certeza de que é uma lista. O segundo exemplo, verificando o,
trigger_roles__id__exact
é uma solução melhor.module.workflow_set.filter(trigger_roles__in=[self.role.id],allowed=True)
fonte