如果集合的所有属性都不匹配,Django 从查询集中排除

Django exclude from queryset if all attributes of the set not match

我有 2 个模型课程和 Class

我试图排除 ALL 他的 classes 职位空缺为 0 的课程,但如果只有 class职位空缺为0.

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

Class是:

如果您正在尝试获取包含所有课程列表的查询集,其中任何关联 class 中至少有一个空缺,试试这个:

courses = Course.objects.filter(class__vacancies__gte = 1).distinct()

您的 filter() 参数中不需要 _set;当对数据库进行调用时,它无论如何都会加入 CourseClass tables。

我想你知道,但为了清楚起见,我要指出,__vacancies 是 Django 在相关 table 中表示字段的 shorthand 方式;在这种情况下,相关 table 是 Class table,相关字段是 vacancies.

.filter(class__vacancies__gte = 1) 中的 __gte 是“大于或等于”,所以基本上这个函数得到了所有 Course-Class 组合的列表在 class 中至少有一个空位,那么 return 就是 Course 对象。

如果您有一个 Course 和两个 Classes,并且两个 Classes 都有空缺,则 Course.objects.filter(class__vacancies__gte = 1) 会 return 重复 Courses。我假设您只想要一个带有开放 classes 的课程列表,因此重复是不可取的。为了删除重复项,您需要包含 .distinct().

.distinct() 可能会很棘手,具体取决于您的具体用例。在 https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.distinct

查看 Django 文档