如果集合的所有属性都不匹配,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
;当对数据库进行调用时,它无论如何都会加入 Course
和 Class
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 文档
我有 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
;当对数据库进行调用时,它无论如何都会加入 Course
和 Class
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