首页 > 解决方案 > django REST api 通用视图的 queryset 属性

问题描述

我试图了解 django rest 框架通用 API 视图,文档告诉我,在覆盖通用视图的方法时,我不应该queryset直接访问属性,而是访问get_queryset()函数,因为显然 queryset 属性只评估一次,有什么get_queryset()不同?查询集属性是否会更新?

标签: pythondjangodjango-rest-framework

解决方案


进一步扩展,源代码将告诉你真相。

    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() 相比,对该值的进一步引用不会是最新的。


推荐阅读