如果对象具有指定值或为 isnull,则进行 Django 过滤

Django filtering if an object has the specified value or is either isnull

我认为 returns 所有在 request.user 拥有的学校工作或学生的用户,在我的模型中我有两个字段 workslearns 是引用学校对象的外键字段,在过滤用户以匹配 request.user 拥有的学校时,我必须像这样过滤:

class AllUserList(generics.ListAPIView):
    permission_classes = [IsSchoolOwner, ]
    # queryset = User.objects.exclude(type__isnull=True)
    serializer_class = ListUsersSerializer

    def get_queryset(self):
        request = self.request.user
        if request.type == User.TYPES.OWNER:
            queryset = User.objects.filter(is_active=True,
                                           type__isnull=False, works__in=request.owns.all(), learns__in=request.owns.all())
        return queryset

这里有一个问题,因为在学校工作的用户将 learns 字段设为空,而学生将 works 字段设为空,所以我如何找到是否的字段匹配,如果匹配则忽略其他字段。

您可以用 Q object [Django-doc] 指定一个条件来定义 disjunctive 条件:

class AllUserList(generics.ListAPIView):
    permission_classes = [IsSchoolOwner, ]
    model = User
    queryset = User.objects.all()
    serializer_class = ListUsersSerializer

    def get_queryset(self):
        user = self.request.user
        qs = super().get_queryset()
        if request.type == User.TYPES.OWNER:
            qs = qs.filter(
                <strong>Q(</strong>works__in=user.owns.all()<strong>) | Q(</strong>learns__in=user.owns.all()<strong>)</strong>,
                is_active=True, type__isnull=False
            )
        return qs

有关详细信息,请参阅 Complex lookups with Q objects section of the documentation