【问题标题】:"AssertionError: Cannot apply DjangoModelPermissions" even when get_queryset is defined in view“AssertionError:无法应用 DjangoModelPermissions”,即使在视图中定义了 get_queryset
【发布时间】:2017-01-12 08:36:59
【问题描述】:

我收到以下错误即使我的视图覆盖了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

我的设置.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 方法?

【问题讨论】:

  • 这个问题有什么进展或变化吗?代码好像没问题,不知道是什么问题。
  • 我打赌这是微不足道的。如果我发现问题会更新。
  • 您是否尝试清理 pyc 文件?这有时会有所帮助。
  • 刚刚删除了所有__pycache__ 文件夹并删除了runserver。没有成功。

标签: python django django-rest-framework


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-05-21
    • 2015-09-28
    • 2018-12-03
    • 2016-07-26
    • 2014-10-06
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多