1. ホーム
  2. python

[解決済み] Django の contains による多対多のフィルタリング

2022-12-12 03:01:01

質問

多対多のリレーションでオブジェクトの束をフィルタリングしようとしています。なぜなら 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)

解決策は簡単なのかもしれないが、私の脳は教えてくれない。

ありがとうございました。

どのように解決するのですか?

このようなことを試されましたか。

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

または、もし self.role.id が pk のリストでない場合。

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