Django исключение из набора запросов, если все атрибуты набора не совпадают

У меня есть 2 модели Курс и Класс

model

Я пытаюсь исключить курсы, где ALL его вакансии в классах равны 0, но этот запрос исключает курс, если только одна из вакансий в классах равна 0.

 courses = Course.objects.all().exclude(class_set__vacancies=0)

Классы:

enter image description here

Если вы пытаетесь получить 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

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