Próbuję przefiltrować zbiór obiektów przez relację wiele do wielu. Ponieważ trigger_roles
pole może zawierać wiele wpisów, wypróbowałem contains
filtr. Ale ponieważ jest to przeznaczone do użytku ze stringami, jestem prawie bezradny, jak powinienem filtrować tę relację (możesz zignorować values_list()
atm.).
Ta funkcja jest dołączona do profilu użytkownika:
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)
Mój model przepływu pracy wygląda następująco (uproszczony):
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)
Chociaż rozwiązanie może być dość proste, mój mózg mi nie powie.
Dzięki za pomoc.
python
django
django-models
many-to-many
django-orm
Grave_Jumper
źródło
źródło
self.role.id
jest jedną z ról wyzwalacza, ten filtr powinien pobierać wszystkie przepływy pracy, w których jedna z ról wyzwalacza jest wartością wself.role.id
. Zasadniczo będzie to zachowywać się dokładnie tak, jak funkcja „zawiera”. Chyba że wszyscy czegoś brakuje.Najprostszym podejściem do osiągnięcia tego byłoby sprawdzenie równości w całej instancji (zamiast id) w pliku
ManyToManyField
. Wygląda na to, że instancja znajduje się w relacji wiele do wielu. Przykład:module.workflow_set.filter(trigger_roles=self.role, allowed=True)
źródło
Wiem, że to stare pytanie, ale wygląda na to, że OP nigdy nie uzyskał odpowiedzi, której szukał. Jeśli masz dwa zestawy ManyToManyFields, które chcesz porównać, sztuczka polega na użyciu
__in
operatora, a niecontains
. Na przykład, jeśli masz model „Event” z polem ManyToMany do „Group”eventgroups
, a model użytkownika (oczywiście) jest dołączony do grupy, możesz zapytać w ten sposób:Event.objects.filter(eventgroups__in=u.groups.all())
źródło
osobliwość ma prawie rację w pierwszym przykładzie. Musisz tylko upewnić się, że to lista. Drugi przykład, sprawdzenie
trigger_roles__id__exact
jest lepszym rozwiązaniem.module.workflow_set.filter(trigger_roles__in=[self.role.id],allowed=True)
źródło