即使我的观点覆盖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
我的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'
]
}
编辑 - 其他信息:以下是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
方法?
答案 0 :(得分:0)
我已尝试在DRF 3.3.2上运行您的代码,并且可能会发现一些容易遗漏的错误,这些错误可能导致您提到的AssertionError。
get_queryset()
。这里的问题看起来不错,但请仔细检查您的代码。get_queryset
的代码中,如果出现异常,则返回None
。我尝试在get_queryset
下强制执行异常,并按照您的方式对其进行静音(最后返回None)。这导致确切的AssertionError。因此,请确保get_queryset
下的代码不会引发任何异常。我认为可以引发异常的一个方面是,当命名网址组“质量”未传递到self.kwargs
时。旁注:当DRF调用权限类'has_permission
方法时,它会将api视图作为参数发送。然后使用api视图来确定您的queryset是什么。如果您可以在'rest_framework / permissions.py'(here)设置调试器并在has_permission
方法内暂停,则可以仔细检查queryset
变量是否正确选中,或设置为无。在你的情况下,它可能会出现为None,这是什么触发了AssertionError,然后你可以检查api_view
实例是否作为参数传递给函数,实际上是指PlayerViewSet
的实例或不。