对Djang观点评价的认识

2024-04-26 14:33:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我用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,
             ......
             }

但为什么会这样呢?为什么我不能为每个方法调用计算来自类属性的查询?你知道吗


Tags: truedatagetobjectsresponserequestparamsall
1条回答
网友
1楼 · 发布于 2024-04-26 14:33:45

这与python的关系比与django的关系更密切。假设你有一个文件lib.py

def say_hello():
    print "hello"

GREETINGS = {
    "hello": say_hello()
}

现在转到另一个python文件(或shell)并只导入lib.py,您将在控制台中打印“hello”,因为当您导入该文件时,它将开始解析其中的代码,因此它将创建问候语变量(本例中的参考资料)并调用say\u hello()方法,为您执行查询。但是python足够聪明,如果你再次导入文件,他会记得你之前刚刚导入了它,所以它不会再次加载模块,因为它已经保存了模块引用。你知道吗

您的查询在第一次加载视图时执行一次,重新导入视图不会改变引用

将资源作为类属性放置也是如此。代码是在导入类时执行的(同样可以通过在lib.py示例中创建一个类来测试它)

希望这能澄清:)但也许文档解释得更好https://docs.python.org/2/tutorial/modules.html

注意: 我认为序列化程序上的.data实际上是在执行查询。如果没有它,您的查询和序列化程序将只是作为引用存储,因为ORM是懒惰的。更改资源以提高端点的性能,因为现在如果您请求一个资源(例如“authors”),它仍在执行所有查询(“authors”、“genres”等)

相关问题 更多 >