Wie erstelle ich eine Django-REST-Route, die mehrere Argumente aus der URL extrahiert?

8

Ich habe einige Django-Rest-Framework-APIs für meine Anwendung erstellt. Diese APIs machen beispielsweise Listen von Modellinstanzen zurück und geben an, wie viele Modelle ein vorgegebenes Kriterium erfüllen.

So sieht mein ViewSet aus:

%Vor%

Und so sieht mein urls.py für diesen Endpunkt aus:

%Vor%

Der obige Code erlaubt mir, einen einzelnen Parameter zur API zu nehmen und ihn als das pk-Argument in MyObjectsViewSet.retrieve () zu verwenden. Wenn ich also meinen Browser auf / api / MyObjects / 60 / zeige, wird retrieve () mit pk == 60 aufgerufen. Großartig. Alles ist großartig.

Aber jetzt brauche ich eine API, die mehr tut. Ich brauche eine API, die zwei numerische Parameter ("pk" und "otherArg") verwendet und ein anderes viewSet (MyObjectsNewView) mit diesen beiden Argumenten aufruft. Wenn ich also meinen Browser auf / api / MyObjects / 60/59 / zeige, wird MyObjectsNewView.retrieve () mit den Argumenten pk == 60 und otherArg == 59 aufgerufen.

Wie kann ich meine Routen in url.py und meinen Viewsets so gestalten, dass dies funktioniert?

In anderen Fällen, als ich Nicht-REST-URLs entwarf, verwendete ich Regexps und verwendete eine Notation wie diese, um Extrahierungsargumente aus einer URL-Zeichenfolge anzugeben: (?P<MyObjectID>\d+) .

Es scheint, als ob ich in der Lage wäre, hier die gleichen Dinge zu tun. Allerdings nimmt es das Argument pk automatisch auf, ohne dass ich es irgendwo in der Route angeben muss. Jetzt bin ich verwirrt, wie man ein weiteres Argument zu dieser Route hinzufügt, wenn das erste Argument pk ohne jedes reguläre Muster magisch erscheint.

    
Saqib Ali 03.03.2014, 06:50
quelle

2 Antworten

4

Schreiben Sie eine benutzerdefinierte Detailroute und ändern Sie die Signatur, um den zusätzlichen Kwarg zu übergeben, den Sie verwenden möchten. Passen Sie dann den URL-Pfad an.

%Vor%

Jetzt funktioniert Ihr Viewset mit /api/MyObjects/60/59/ , wobei pk = 60 und oid = 59 ist. Wenn der URL_Pfad stattdessen url_path='/thisthing/(?P(<oid>\d+)' wäre, würde der Viewset /api/MyObjects/60/thisthing/59 registrieren.

    
Patti 04.03.2016 18:05
quelle
3

Sie können das folgende Muster haben:

%Vor%

Und die RestResource-Klasse kann etwa so aussehen:

%Vor%

Es akzeptiert "PUT" und "DELETE" Anfragen und die in der Route definierten Parameter werden in der Klassenmethode empfangen.

Hoffe es hilft dir, Ich bin für weitere Details verfügbar, wenn Sie mich brauchen.

    
Alexandru Godri 23.05.2015 15:11
quelle

Tags und Links