Django исключение из набора запросов, если все атрибуты набора не совпадают
У меня есть 2 модели Курс и Класс
Я пытаюсь исключить курсы, где ALL его вакансии в классах равны 0, но этот запрос исключает курс, если только одна из вакансий в классах равна 0.
courses = Course.objects.all().exclude(class_set__vacancies=0)
Классы:
Если вы пытаетесь получить Queryset, содержащий список всех курсов, где есть хотя бы одна вакансия в любом связанном классе, попробуйте сделать следующее:
courses = Course.objects.filter(class__vacancies__gte = 1).distinct()
Вам не нужно _set в аргументе filter(); когда происходит обращение к базе данных, она все равно соединяет таблицы Course и Class.
Как, я думаю, вы знаете, но я отмечу для ясности, __vacancies - это сокращенный способ Django представить поле в связанной таблице; в данном случае связанная таблица - это таблица Class, а связанное поле - vacancies.
__gte в .filter(class__vacancies__gte = 1) означает "больше или равно", поэтому, по сути, эта функция получает список всех комбинаций Course-Class, в которых есть хотя бы одна вакансия в классе, а затем возвращает только объект Course.
Если у вас есть Course с двумя Classes, и оба Classes имеют вакансии, Course.objects.filter(class__vacancies__gte = 1) вернет дубликаты Courses. Я предполагаю, что вам просто нужен список курсов с открытыми занятиями, и поэтому дубликаты нежелательны. Чтобы удалить дубликаты, вам нужно включить .distinct().
.distinct() может быть сложно, в зависимости от конкретного случая использования. См. документацию Django по адресу https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.distinct

