我用Django REST框架构建web应用程序。有一个简单的视图,它返回带有db字段的引用信息。resources.py:
RESOURCES = {
'genres': GenreSerializer(Genre.objects.all(), many=True).data,
'authors': AuthorSerializer(Author.objects.all(), many=True).data,
......
}
class ResourceApiView(views.APIView):
def get(self, request):
params = request.query_params
response_dict = {}
if params:
# Return RESOURSES based on query params
for i in params:
q = RESOURCES.get(i)
if q:
response_dict[i] = q
else:
# Return all RESOURSES
response_dict = RESOURCES
return Response(response_dict,
status=status.HTTP_200_OK
)
它工作得很好,但是当我将新对象添加到一个资源查询集时。什么也没发生,它显示旧的查询。
我在我的模块中尝试了printedRESOURSES
,它只打印了一次,其他get请求不会触发它。
然后我直接在类ResourceApiView
中移动RESOURSES
,其行为与模块中的where RESOURSES
相同。你知道吗
class ResourceApiView(views.APIView):
RESOURCES = {
'genres': GenreSerializer(Genre.objects.all(), many=True).data,
'authors': AuthorSerializer(Author.objects.all(), many=True).data,
......
}
def get(self, request):
...
只有当我将RESOURSES
放入get
方法时,它才能正常工作。你知道吗
class ResourceApiView(views.APIView):
def get(self, request):
RESOURCES = {
'genres': GenreSerializer(Genre.objects.all(), many=True).data,
'authors': AuthorSerializer(Author.objects.all(), many=True).data,
......
}
但为什么会这样呢?为什么我不能为每个方法调用计算来自类属性的查询?你知道吗
这与python的关系比与django的关系更密切。假设你有一个文件
lib.py
现在转到另一个python文件(或shell)并只导入
lib.py
,您将在控制台中打印“hello”,因为当您导入该文件时,它将开始解析其中的代码,因此它将创建问候语变量(本例中的参考资料)并调用say\u hello()方法,为您执行查询。但是python足够聪明,如果你再次导入文件,他会记得你之前刚刚导入了它,所以它不会再次加载模块,因为它已经保存了模块引用。你知道吗您的查询在第一次加载视图时执行一次,重新导入视图不会改变引用
将资源作为类属性放置也是如此。代码是在导入类时执行的(同样可以通过在
lib.py
示例中创建一个类来测试它)希望这能澄清:)但也许文档解释得更好https://docs.python.org/2/tutorial/modules.html
注意: 我认为序列化程序上的
.data
实际上是在执行查询。如果没有它,您的查询和序列化程序将只是作为引用存储,因为ORM是懒惰的。更改资源以提高端点的性能,因为现在如果您请求一个资源(例如“authors”),它仍在执行所有查询(“authors”、“genres”等)相关问题 更多 >
编程相关推荐