webentwicklung-frage-antwort-db.com.de

Das Argument base_name wurde nicht angegeben und konnte den Namen nicht automatisch aus dem Viewset ermitteln, da es kein .queryset-Attribut enthält

Das Problem ist folgendes: Ich versuche, das Standard-Abfrageset zu ersetzen:

queryset: MyModel.objects.all()

auf meinem:

def get_queryset(self, username=None):
    if username is not None:
        user = UserModel.objects.get(username=username)
        queryset = MyModel.filter(author=user)
        return queryset
    else:
        queryset = MyModel.objects.all()
        return queryset

wenn ich das "queryset" entferne und nur "get_queryset" lasse, erscheint ein Fehler:

AssertionError: base_name Argument nicht angegeben und konnte den Namen nicht automatisch aus dem Viewset ermitteln, da es kein .queryset Attribut.

Alles zusammen sieht so aus:

class MyModelView(viewsets.ModelViewSet):

permissions_classes = (permissions.IsAuthenticated,)
serializer_class = MyModelleSerializer

def get_queryset(self, username=None):
    if username is not None:
        user = UserModel.objects.get(username=username)
        queryset = MyModel.filter(author=user)
        return queryset
    else:
        queryset = MyModel.objects.all()
        return queryset

lookup_field = 'username'
lookup_value_regex = '[a-zA-Z0-9$&(._)\-]+'

So überschreiben Sie die Methode richtig?

13
woe-dev.

In der neuesten DRF müssen Sie explizit base_name In Ihrer Viewset-URL festlegen, wenn Sie queryset nicht definiert haben.

So etwas sollte also gut tun:

router.register(r'my-model/', MyModelView, basename='MyModel')

Siehe dies: docs Hoffe es hilft.

33

Sie müssen der url.py-Datei ein Argument mit dem Namen base_name für die register-Methode hinzufügen, wie den folgenden Code in url.py:

"In url.py"

.
.
from rest_framework import routers


router = routers.DefaultRouter()
router.register(r'my-model/' , MyModelView , base_name='MyModel') 
urlpattern=[...]
2
omid