我收到以下错误 即使我的观点是压倒一切的 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/