Django中CreateView的queryset属性的作用是什么?
Django CreateView 中 queryset 属性的用途说明
首先明确:CreateView 的 queryset 属性继承自 SingleObjectMixin,并非 CreateView 独有,很多开发者会误以为创建类视图只负责生成新对象,queryset 没有实际作用,实际上它有三个核心适用场景:
- 创建后跳转对象的权限校验
如果你没有自定义get_success_url方法,CreateView默认会调用新创建对象的get_absolute_url方法跳转到详情页,此时queryset会用来校验该对象是否属于合法查询范围。举个例子,如果你设置queryset = Article.objects.filter(author=request.user),即使用户通过篡改请求拿到了其他用户的文章ID,也会因为对象不在queryset范围内返回404,避免越权访问。 - 关联表单字段的可选值过滤
如果你的模型包含外键、多对多类型的关联字段,CreateView自动生成的表单默认会使用关联模型的全量数据作为可选值。配置queryset后可以直接对关联字段的可选范围做过滤,比如要创建的文章只能绑定当前用户自建的分类,就可以通过该属性限制分类的可选范围,不需要手动重写表单的__init__方法调整字段查询集,简化代码逻辑。 - 自定义方法的默认数据源
当你需要重写get_object、form_valid等内置方法时,self.queryset会作为默认的查询数据源,你不需要重复编写相同的过滤逻辑,直接调用父类方法即可拿到符合范围的对象,减少冗余代码。
提示:默认情况下
CreateView的queryset为绑定model的全量查询,如果你不需要做上述的范围限制,不需要显式配置该属性,不会影响正常的对象创建功能。
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

