django REST api通用视图的queryset属性

时间:2018-06-25 18:16:57

标签: python django django-rest-framework

我试图理解django rest框架的通用API视图,该文档告诉我,虽然覆盖通用视图的方法,但我不应该直接访问queryset属性,而应该访问{{1 }}之所以起作用,是因为显然queryset属性仅被评估一次,get_queryset()有何不同之处? queryset属性是否曾经更新过?

2 个答案:

答案 0 :(得分:1)

对于简单视图,queryset属性将使您快速入门。但是在现实生活中,通常情况下,我们对模型具有权限,例如,针对用户的默认queryset将基于request.user过滤查询集。 get_queryset方法将变为

def get_queryset(self):
    return self.model.objects.filter(user=self.request.user)

上述get_queryset方法只是目前的现实API设计示例。

答案 1 :(得分:0)

要进一步扩展,source code将告诉您真相。

    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的查询集类的实例
  • 第三次重新评估(进行数据库查询)查询集并设置结果
  • 第四次返回结果

有关直接使用self.queryset的警告是,对结果进行评估时会缓存结果,因此与使用self.get_queryset()相对,对该值的进一步引用将是最新的。