python - django REST api 通用视图的 queryset 属性
问题描述
我试图了解 django rest 框架通用 API 视图,文档告诉我,在覆盖通用视图的方法时,我不应该queryset
直接访问属性,而是访问get_queryset()
函数,因为显然 queryset 属性只评估一次,有什么get_queryset()
不同?查询集属性是否会更新?
解决方案
进一步扩展,源代码将告诉你真相。
assert self.queryset is not None, (
"'%s' should either include a `queryset` attribute, "
"or override the `get_queryset()` method."
% self.__class__.__name__
)
queryset = self.queryset
if isinstance(queryset, QuerySet):
# Ensure queryset is re-evaluated on each request.
queryset = queryset.all()
return queryset
- 首先它检查查询集是否已定义
- 其次,它检查指定的查询集是否是 Django 的 Queryset 类的实例
- 第三,它重新评估(进行数据库查询)查询集并设置结果
- 第四,它返回结果
关于直接使用 self.queryset 的警告是结果在评估时会被缓存,因此与使用 self.get_queryset() 相比,对该值的进一步引用不会是最新的。
推荐阅读
- php - 页面在 Ajax 调用中冻结
- c++11 - 如果设置 protobuf 可序列化类的值,为什么会出现 zmq 错误?
- python - 在 python 中执行准备好的语句 IBM_DB 时出现绑定错误
- vb.net - 从 .NET Windows 服务将大文件部署到 Artifactory 存储库
- python - 在列表、输入中寻找东西
- r - 获取 R 中基因名称列表的基因 ID
- google-analytics - AnonymizeIp 和 IP 过滤器
- java - Logstash JDBC 插件 - 并非所有从 oracle 进入 elasticsearch 的字段
- reactjs - 使用 react-redux 正确映射 stateToProps
- vba - VBA - 字典通过一个包含两个值的工作表,计算这两个值,然后用分隔符分割这些值