无法在没有 `.queryset` 属性或覆盖 `.get_queryset()` 方法的视图上应用 DjangoModelPermissions
Posted
技术标签:
【中文标题】无法在没有 `.queryset` 属性或覆盖 `.get_queryset()` 方法的视图上应用 DjangoModelPermissions【英文标题】:Cannot apply DjangoModelPermissions on a view that does not have `.queryset` property or overrides the `.get_queryset()` method 【发布时间】:2015-09-28 21:44:21 【问题描述】:我收到错误“.accepted_renderer not set on Response resp api django”。
我正在关注 django rest-api 教程。 我使用的 Django 版本 1.8.3 我按照教程直到第一部分。它工作正常。但是当我继续发送响应的第二部分时,我收到了一个错误
Cannot apply DjangoModelPermissions on a view that does not have `.queryset` property or overrides the `.get_queryset()` method.
然后我尝试了其他方法我得到了
.accepted_renderer not set on Response resp api django
请帮帮我。我认为它的权限问题。
【问题讨论】:
你能发布你的代码来澄清一下吗? @EdwinLunando 我也得到了同样的结果。很容易复现,按照官网教程django-rest-framework.org/tutorial/2-requests-and-responses即可 【参考方案1】:来自Django Rest Framework's documentation,,您可以将其添加到您的视图中:
queryset = User.objects.none()
【讨论】:
【参考方案2】:这里已经列出了很多好的解决方案。我在第二个教程中也遇到了同样的问题。它正在显示:
不能在一个视图上应用 DjangoModelPermissionsOrAnonReadOnly 未设置
.queryset
或有.get_queryset()
方法。
我将settings.py
更改为排除DEFAULT_PERMISSION_CLASSES
,如下所示:
REST_FRAMEWORK =
'DEFAULT_PERMISSION_CLASSES': [
]
然后运行成功。在找到这些答案之前,我已经尝试过了。
【讨论】:
【参考方案3】:就我而言,(对于教程 2,djangorestframework
ver 3.7.7),当我将设置更改为:
REST_FRAMEWORK =
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.AllowAny',
]
【讨论】:
【参考方案4】:您可能已在设置中将DjangoModelPermissions
设置为默认权限类。比如:
REST_FRAMEWORK =
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.DjangoModelPermissions',
)
DjangoModelPermissions
只能应用于具有.queryset
属性或.get_queryset()
方法的视图。
由于教程 2 使用 FBV,您可能需要将其转换为 CBV,或者一种简单的方法是为该视图指定不同的权限类。
您必须在视图中使用 api_view
装饰器。然后您可以定义permissions
,如下所示:
from rest_framework.decorators import api_view, permission_classes
from rest_framework import permissions
@api_view([..])
@permission_classes((permissions.AllowAny,))
def my_view(request)
...
要解决渲染器错误,您需要将相应的渲染器添加到您的设置中。
REST_FRAMEWORK =
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.<corresponding_renderer>',
...
)
【讨论】:
快速修复,现在注释掉'rest_framework.renders.DjangoModelPermissions'
行——如果你遵循 DRF 教程 2;也许你在 homepage 示例中在settings.py
中添加了它。
在您的第二个代码块中,您还需要import rest_framework.permissions
。
这是一个更好的答案,因为它允许开发人员决定要与视图一起使用的特定权限类。欣赏它,因为这让我明白了为什么。谢谢!【参考方案5】:
我的解决方案正如上面@ProfNandaa 指出的那样
快速修复,注释掉 'rest_framework.renders.DjangoModelPermissions' 行——如果你 正在遵循 DRF 教程 2;也许你在 主页示例中的 settings.py。
在开始教程之前,我确实从主页示例中添加了这个并遇到了同样的问题。
当我注释掉有问题的代码时
REST_FRAMEWORK =
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.DjangoModelPermissions',
)
在 settings.py 中一切正常。
【讨论】:
【参考方案6】:我让它以另一种方式工作。 我的登录用户是我创建的超级用户。 所以我从管理员创建了另一个用户并让他成为员工用户并提供所有权限。然后由该用户登录到管理员。
在 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.IsAuthenticated',
]
它奏效了。
【讨论】:
太棒了!实际上,问题出在权限上。在设置中或通过 FBV 中的装饰器明确定义权限将解决问题。以上是关于无法在没有 `.queryset` 属性或覆盖 `.get_queryset()` 方法的视图上应用 DjangoModelPermissions的主要内容,如果未能解决你的问题,请参考以下文章
QuerySet 对象在 Django Rest Framework 上没有属性“用户”
Django 'QuerySet' 对象没有使用 modelform 的属性'split'
AttributeError:“QuerySet”对象没有属性“标签”