Django REST框架:重写get_queryset()有时会返回一个双倍的querys

2024-10-01 15:40:41 发布

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

我做了一个小端点,调整了DRFReadOnlyModelViewSet,定义如下:

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'行来研究这个问题。当加倍发生时,我在日志中读到:

^{pr2}$

似乎get_queryset被多次调用。这很奇怪。我没有报告该方法内部的逻辑细节,我认为问题出在别处,或者是一个bug……我该如何解决?在


Tags: debugselfdataget定义端点amclass
3条回答

您已将queryset定义为类属性。在

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

这意味着每次追加到self.queryset时,都是附加到同一个列表中。您的get_queryset方法只被调用一次,但是self.queryset在方法的开头已经有了条目。要查看实际问题,请在方法的最开始处,在更改它之前,print self.queryset。在

你最好做些类似的事情:

^{pr2}$

如果您使用的是自定义权限,如djangModelPermissions。您需要检查是否没有调用视图的get_queryset方法。在

例如,DjangoModelPermissions调用此方法here

if hasattr(view, 'get_queryset'):
    queryset = view.get_queryset()
else:
    queryset = getattr(view, 'queryset', None)

如果我按原样使用这个许可。方法get_queryset将被调用两次。在

所以我改成这样:

^{pr2}$

结果只调用一次。希望这有帮助。在

也有同样的问题,只是追踪了一下 第二次运行的是rest\u框架的呈现文件调用查看.get_queryset(). 在

尝试从命令行调用它,然后检查结果。在

相关问题 更多 >

    热门问题