Джанго фильтра многие-ко-многим с содержится



Я пытаюсь отфильтровать кучу объектов через отношение "многие ко многим". Поскольку поле trigger_roles может содержать несколько записей, я попробовал фильтр contains. Но поскольку это предназначено для использования со строками, я в значительной степени беспомощен, как я должен фильтровать это отношение (вы можете игнорировать values_list() atm.).



эта функция прикреплена к профилю пользователя:



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)


хотя решение может быть тихим простым, мой мозг не скажет мне.



Спасибо за вашу помощь.

680   4  

4 ответов:

вы пробовали что-то вроде этого:

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

или self.role.id это не список pks:

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

самый простой подход для достижения этого-проверка равенства по всему экземпляру (вместо идентификатора) в ManyToManyField. Это выглядит, если экземпляр находится внутри отношения "многие ко многим". Пример:

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

сингулярность почти права с первым примером. Вам просто нужно убедиться, что это список. Второй пример, проверка trigger_roles__id__exact Это лучшее решение, хотя.

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

Я знаю, что это старый вопрос, но похоже, что ОП никогда не получал ответа, который он искал. Если у вас есть два набора ManyToManyFields вы хотите сравнить, трюк заключается в использовании __in оператор, а не contains. Так, например, если у вас есть модель "событие" с ManyToMany для "группы" на поле eventgroups, и ваша модель пользователя (очевидно) присоединяется к группе, вы можете запросить следующее:

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

Comments

    Ничего не найдено.