/ / "AssertionError: DjangoModelPermissions kann nicht angewendet werden", selbst wenn get_queryset in View definiert ist - python, django, django-rest-framework

"AssertionError: DjangoModelPermissions kann nicht angewendet werden", auch wenn get_queryset in View definiert ist - python, django, django-rest-framework

Ich bekomme den folgenden Fehler obwohl meine Sicht überwiegt get_queryset().

AssertionError: Cannot apply DjangoModelPermissions on a view that does not set `.queryset` or have a `.get_queryset()` method.

Hier ist meine Meinung:

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

Meine 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"
]
}

Bearbeiten - Zusätzliche Informationen: Hier ist der Eintrag in 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)),
]

Ich verstehe nicht, was das Problem ist. Warum sieht DRF meine get_queryset Methode?

Antworten:

0 für die Antwort № 1

Ich habe versucht, Ihren Code auf DRF 3.3.2 laufen und könnte ein paar leicht zu übersehen Fehler, die zu der AssertionError, die Sie erwähnt haben führen.

  1. Falsch geschrieben get_queryset(). Sieht in Ihrer Frage gut aus, aber überprüfen Sie Ihren Code, um sicher zu gehen.
  2. In deinem Code ein get_queryset, du kehrst zurück None im Falle einer Ausnahme. Ich habe versucht, eine Ausnahme in unter zu erzwingen get_querysetund es so zum Schweigen bringen, wie du es getan hast (am Ende gibt es None zurück). Dies führt zum genauen AssertionError. Also vergewissere dich, dass dein Code unter get_querysetEs gibt keine Ausnahmen. Ein Bereich, in dem eine Ausnahme ausgelöst werden könnte, ist, wenn die angegebene URL-Gruppe "Qualität" nicht überschritten wird self.kwargs.

Randnotiz: Wenn DRF die Berechtigungsklasse aufruft " has_permission Methode sendet es die API-Sicht als ein Argument. Anschließend verwendet es die API-Ansicht, um herauszufinden, wie Ihr Suchanfragensatz aussieht. Wenn Sie einen Debugger unter "rest_framework / permissions.py" (Hier) und innehalten in der has_permission Methode, können Sie dann überprüfen, ob die queryset Variable wird korrekt aufgenommen oder auf Keine gesetzt. In Ihrem Fall wird es wahrscheinlich als Keine kommen, was den AssertionError auslöst, Sie können dann überprüfen, ob der api_view Instanz, die an die Funktion als Parameter übergeben wird, bezieht sich auf eine Instanz von PlayerViewSet oder nicht.