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

Jad*_*d S 5 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.
Run Code Online (Sandbox Code Playgroud)

这是我的观点:

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
Run Code Online (Sandbox Code Playgroud)

我的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'
    ]
}
Run Code Online (Sandbox Code Playgroud)

编辑 - 附加信息:这是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)),
] 
Run Code Online (Sandbox Code Playgroud)

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

ari*_*eet 0

我尝试在 DRF 3.3.2 上运行您的代码,并且可以找出一些容易错过的错误,这些错误可能会导致您提到的 AssertionError 。

  1. 拼写错误get_queryset()。您的问题在这里看起来不错,但请仔细检查您的代码以确定。
  2. 在 中的代码中get_queryset,您将None在出现异常时返回。我尝试按照您所做的方式强制异常get_queryset并使其静音(最后返回 None )。这导致了确切的断言错误。因此,请确保您的代码get_queryset不会引发任何异常。我认为可能会引发异常的一个领域是,当命名的 url 组“quality”未传递到self.kwargs.

旁注:当 DRF 调用权限类的has_permission方法时,它会发送 api 视图作为参数。然后它使用 api 视图来找出您的查询集是什么。如果您可以在“rest_framework/permissions.py”(此处)设置调试器并在方法内暂停has_permission,则可以仔细检查变量是否queryset已正确拾取或设置为 None。在您的情况下,它可能会出现为 None ,这就是触发 AssertionError 的原因,然后您可以检查作为api_view参数传递给函数的实例是否实际上引用了实例PlayerViewSet