[python] 포함을 사용하여 Django 필터 다 대다

다 대다 관계를 통해 여러 개체를 필터링하려고합니다. 때문에 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)

해결책은 조용하지만 간단 할 수 있지만 내 뇌는 말하지 않습니다.

당신의 도움을 주셔서 감사합니다.



답변

다음과 같은 것을 시도해 보셨습니까?

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

또는 self.role.idpks 목록이 아닌 경우 :

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


답변

이를 달성하는 가장 간단한 방법은 .NET Framework에서 전체 인스턴스 (ID 대신)에 대한 동등성을 확인하는 것 ManyToManyField입니다. 인스턴스가 다 대다 관계 내에 있는지 확인합니다. 예:

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


답변

나는 이것이 오래된 질문이라는 것을 알고 있지만 OP가 그가 찾고 있던 대답을 얻지 못한 것 같습니다. 당신은 당신이 비교할 ManyToManyFields 두 세트가있는 경우, 트릭이 사용하는 것입니다 __in, 연산자를하지 contains. 예를 들어 필드에 ManyToMany가 “Group”인 “Event”모델이 있고 eventgroups사용자 모델 (분명히)이 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)


답변