Я пытаюсь отфильтровать кучу объектов через отношение «многие ко многим». Поскольку trigger_roles
поле может содержать несколько записей, я попробовал contains
применить фильтр. Но поскольку это предназначено для использования со строками, я почти беспомощен, как мне фильтровать это отношение (вы можете игнорировать values_list()
банкомат).
Эта функция привязана к профилю пользователя:
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)
Моя модель рабочего процесса выглядит так (упрощенно):
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)
Хотя решение может быть довольно простым, мой мозг не подскажет.
Спасибо за вашу помощь.
python
django
django-models
many-to-many
django-orm
Grave_Jumper
источник
источник
self.role.id
- одна из ролей триггера, то этот фильтр должен отобрать все рабочие процессы, в которых одна из ролей триггера является значением вself.role.id
. В основном это будет вести себя точно так же, как функция "содержит". Если только мы все чего-то не упустим.Самый простой способ добиться этого - проверить равенство всего экземпляра (вместо идентификатора) в
ManyToManyField
. Это выглядит, если экземпляр находится внутри отношения многие ко многим. Пример:module.workflow_set.filter(trigger_roles=self.role, allowed=True)
источник
Я знаю, что это старый вопрос, но похоже, что ОП так и не получил ответа, который искал. Если у вас есть два набора ManyToManyFields, которые вы хотите сравнить, хитрость заключается в использовании
__in
оператора, а неcontains
. Так, например, если у вас есть модель «Событие» с полем ManyToMany to «Group» oneventgroups
, а ваша модель User (очевидно) присоединена к Group, вы можете запросить следующее:Event.objects.filter(eventgroups__in=u.groups.all())
источник
сингулярность почти совпадает с первым примером. Вам просто нужно убедиться, что это список. Второй пример, проверка
trigger_roles__id__exact
- лучшее решение.module.workflow_set.filter(trigger_roles__in=[self.role.id],allowed=True)
источник