我试图理解django rest框架的通用API视图,该文档告诉我,虽然覆盖通用视图的方法,但我不应该直接访问queryset
属性,而应该访问{{1 }}之所以起作用,是因为显然queryset属性仅被评估一次,get_queryset()
有何不同之处?
queryset属性是否曾经更新过?
答案 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
有关直接使用self.queryset的警告是,对结果进行评估时会缓存结果,因此与使用self.get_queryset()相对,对该值的进一步引用将是最新的。