如何在Django

时间:2019-01-18 01:50:15

标签: python django django-models django-queryset

我有两种模式,一种是组织模式,一种是具有组织中用户的成员资格和角色的模型

class Organization(models.Model):
    name = models.CharField(blank=False,null=False,max_length=100, unique=True)

class Member(models.Model):
    user_request = models.ForeignKey('accounts.User',on_delete=models.CASCADE,related_name="member_user_request")
    user_second = models.ForeignKey('accounts.User',on_delete=models.CASCADE,blank=True,null=True, related_name="member_user_second")
    role = models.ForeignKey(RoleOrganization,on_delete=models.CASCADE, verbose_name=_('Rol'))
    status = models.ForeignKey(Status,on_delete=models.CASCADE, verbose_name=_('Status'))
    organization = models.ForeignKey(Organization,on_delete=models.CASCADE, verbose_name=_('Organization'))

并且我试图使用带注释的case子句,在这里我想通过以下表达式获得组织中用户的角色:

my_organizations = Member.objects.filter(
        Q(user_request_id=self.request.user.id, status__name="accepted", type_request__name="request") |
        Q(user_second_id=self.request.user.id, status__name="accepted", type_request__name="invitation")
    )

Organization.objects.annotate(
        rol=Case(
            When(id__in=list(my_organizations.values_list('organization_id', flat=True)),
                 then=Value(my_organizations.get(organization_id=F('id')).role.name)),
            default=None, output_field=CharField()
        )
    )

这里的问题是,then表达式未获取主查询集中的对象的id,如果我返回then,则仅F('id')表达式将获取主查询集中的id的值queryset,但是我可以使用过滤器或任何带有主对象某些值的queryset表达式。

有一种方法可以做到这一点。 PS:我只是将部分代码放在此处以保持整洁,但是如果您需要了解更多信息,请告诉我

1 个答案:

答案 0 :(得分:1)

我认为您可以使用Subquery来做到这一点:

from django.db.models import OuterRef, Subquery

members = Member.objects.filter(
           Q(user_request_id=self.request.user.id, status__name="accepted", type_request__name="request") |
           Q(user_second_id=self.request.user.id, status__name="accepted", type_request__name="invitation")
        )

member_subquery = members.filter(organization=OuterRef('pk'))

organizations = Organization.objects.annotate(member_role=Subquery(member_subquery.values('role')[:1]))

print(organizations.values('member_role'))