如果对象具有指定值或为 isnull,则进行 Django 过滤
Django filtering if an object has the specified value or is either isnull
我认为 returns 所有在 request.user 拥有的学校工作或学生的用户,在我的模型中我有两个字段 works
和 learns
是引用学校对象的外键字段,在过滤用户以匹配 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。
我认为 returns 所有在 request.user 拥有的学校工作或学生的用户,在我的模型中我有两个字段 works
和 learns
是引用学校对象的外键字段,在过滤用户以匹配 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。