python - Django REST 框架 : overriding get_queryset() sometimes returns a doubled queryset

标签 python django django-rest-framework

我做了一个小端点,适配DRF ReadOnlyModelViewSet,定义如下:

class MyApi(viewsets.ReadOnlyModelViewSet):

    queryset = []
    serializer_class = MySerializer

    def get_queryset(self):
        print 'Debug: I am starting...\n\n\n\n'
        # do a lot of things filtering data from Django models by some information on neo4j and saving data in the queryset...
        return self.queryset

当我通过 URL 调用 MyApi 时,它返回的结果没有任何问题,但有时它会返回双倍的结果!!很奇怪...这不是系统错误,只是偶尔会发生。

我使用 Apache 日志中的行 print 'Debug: I am starting...\n\n\n\n' 来调查问题。当发生翻倍时,我在日志中读到:

Debug: I am starting...




Debug: I am starting...

get_queryset 似乎被调用了不止一次。这很奇怪。我没有报告该方法内部的逻辑细节,我认为问题出在其他地方或者是错误...我该如何解决?

最佳答案

您已将 queryset 定义为类属性。

class MyApi(viewsets.ReadOnlyModelViewSet):
    queryset = []

这意味着每次您追加到 self.queryset 时,您都追加到同一个列表。您的 get_queryset 方法仅被调用一次,但 self.queryset 在该方法的开头已经有条目。要查看实际问题,请在开始时在您的方法中打印 self.queryset,然后再进行更改。

你最好这样做:

class MyApi(viewsets.ReadOnlyModelViewSet):
    queryset = None  # this line is probably not required, but some code checking tools like it to be defined.

    def get_queryset(self):
        self.queryset = []
        ...
        return self.queryset

关于python - Django REST 框架 : overriding get_queryset() sometimes returns a doubled queryset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31809447/

相关文章:

python-3.x - `django.test.APITestCase` 和 `rest_framework.test.TestCase` 中的 `python-django` 有什么区别

python - InvalidResourceType 在命名空间 Azure Python SDK 错误中找不到资源类型

python - 从父类(super class)的父类(super class)调用方法

python - Django Tastypie : How to Authenticate with API Key

Django 管理员登录 403 Forbidden (CSRF cookie 未设置。)

python - 通过 API 调用发送大字典会中断开发服务器

Python:- 从给定的中序遍历返回前序遍历

python - 使用python错误将 'UCS-2 Little Endian'文件编码为 'utf8'

python - Django,模板中的 url 标记不起作用 : NoReverseMatch

python - Django,使用尖括号捕获值时 URL 调度程序不工作