Django фильтрует, если объект имеет указанное значение или является isnull
У меня есть представление, которое возвращает всех пользователей, которые работают или учатся в школе, которой владеет request.user, в моей модели есть два поля works и learns, которые являются полями foreignkey, ссылающимися на объект school, при фильтрации пользователей на соответствие школе, которой владеет 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 как null, а ученики будут иметь поле works как null, поэтому как я могу найти, совпадает ли одно из полей, и если да, то чтобы оно игнорировало другое поле.
Вы можете задать условие с помощью Q объекта [Django-doc] для определения дизъюнктивных условий:
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(
Q(works__in=user.owns.all()) | Q(learns__in=user.owns.all()),
is_active=True, type__isnull=False
)
return qs
Для получения дополнительной информации смотрите раздел Сложные поиски с Q объектами в документации.