[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.id
pks 목록이 아닌 경우 :
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)