python - "AssertionError: Cannot apply DjangoModelPermissions"即使在 View 中定义了 get_queryset

标签 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

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

最佳答案

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

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

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

    关于python - "AssertionError: Cannot apply DjangoModelPermissions"即使在 View 中定义了 get_queryset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39322708/

    相关文章:

    django-rest-framework - 如何基于序列化器获取分页响应模式(drf-yasg)

    django - 通过 Django 后端和 Angular 前端删除 MongoDB 集合中的所有文档

    python - 通过Django Rest中的ForeignKey访问另一个模型中的字段

    python动态类名

    python - 使用 subprocess.popen 登录后如何保持 ssh session 打开?

    django css 和 js 文件

    django - 如何动态更新 Form ChoiceField 中的 'initial' 值

    python - 基于工程单位的元组排序列表

    Python打开和读取文件一类

    django - 如果列数太多,是否应该将表除以 OneToOneField?