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 объектами в документации.

Вернуться на верх