“AssertionError:无法应用DjangoModelPermissions”,即使在视图中定义了get_queryset也是如此

时间:2016-09-05 00:51:03

标签: python django django-rest-framework

即使我的观点覆盖get_queryset(),我也会收到以下错误

AssertionError: Cannot apply DjangoModelPermissions on a view that does not set `.queryset` or have a `.get_queryset()` method.

以下是我的观点:

class PlayerViewSet(viewsets.ModelViewSet):

    serializer_class = PlayerSerializer

    def get_queryset(self):
        try:
            quality = self.kwargs['quality'].lower()
            print("Getting Player for %s"%quality)
            return Player.objects.filter(qualities__contains=quality)
        except:
            # todo: send out a 404
            print("No Players found for this quality :(")
            pass

我的settings.py:

REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
    ]
}

编辑 - 其他信息:以下是urls.py中的条目:

router = routers.DefaultRouter()
router.register(r'^player-list/(?P<quality>\w+)', players.views.PlayerViewSet, base_name="Player List")
[...]
urlpatterns = [
    url(r'^api/', include(router.urls)),
] 

我不明白这是什么问题。为什么DRF没有看到我的get_queryset方法?

1 个答案:

答案 0 :(得分:0)

我已尝试在DRF 3.3.2上运行您的代码,并且可能会发现一些容易遗漏的错误,这些错误可能导致您提到的AssertionError。

  1. 拼错get_queryset()。这里的问题看起来不错,但请仔细检查您的代码。
  2. get_queryset的代码中,如果出现异常,则返回None。我尝试在get_queryset下强制执行异常,并按照您的方式对其进行静音(最后返回None)。这导致确切的AssertionError。因此,请确保get_queryset下的代码不会引发任何异常。我认为可以引发异常的一个方面是,当命名网址组“质量”未传递到self.kwargs时。
  3. 旁注:当DRF调用权限类'has_permission方法时,它会将api视图作为参数发送。然后使用api视图来确定您的queryset是什么。如果您可以在'rest_framework / permissions.py'(here)设置调试器并在has_permission方法内暂停,则可以仔细检查queryset变量是否正确选中,或设置为无。在你的情况下,它可能会出现为None,这是什么触发了AssertionError,然后你可以检查api_view实例是否作为参数传递给函数,实际上是指PlayerViewSet的实例或不。