Ich bin Anfänger in Django REST-Framework und brauche Ihren Rat. Ich entwickle einen Webservice. Der Dienst muss eine REST-Schnittstelle zu anderen Diensten bereitstellen. Die REST-Schnittstelle, die ich implementieren muss, arbeitet nicht direkt mit meinen Modellen (ich meine die Operationen get, put, post, delete). Stattdessen bietet es andere Dienste mit einigen Berechnungsergebnissen. Bei einer Anfrage führt mein Dienst einige Berechnungen durch und gibt die Ergebnisse nur zurück (speichert die Ergebnisse nicht in einer eigenen Datenbank).Django REST-Framework: Nicht-Modell-Serializer
Unten ist mein Verständnis davon, wie diese REST-Schnittstelle implementiert werden könnte. Korrigiere mich, wenn ich falsch liege.
- Klasse erstellen, die die Berechnungen durchführt. Nenne es 'CalcClass'. CalcClass verwendet die Modelle in seiner Arbeit.
- Parameter, die für die Berechnungen erforderlich sind, werden an den Konstruktor übergeben.
- Implementieren Sie den Berechnungsvorgang. Es gibt Ergebnisse als 'ResultClass' zurück.
- Erstellen Sie ResultClass.
- Vom Objekt abgeleitet.
- Es hat nur nur Attribute, die die calc-Ergebnisse enthalten.
- Ein Teil der Berechnungsergebnisse wird als Tupel-Tupel dargestellt. Wie ich es verstehe, wäre es für die weitere Serialisierung besser, eine separate Klasse für diese Ergebnisse zu implementieren und eine Liste solcher Objekte zu ResultClass hinzuzufügen.
- Erstellen Sie Serializer für ResultClass.
- Ableitung von Serializers.Serializer.
- Die Kalkulationsergebnisse sind schreibgeschützt. Verwenden Sie daher hauptsächlich die Feldklasse für Felder anstelle von spezialisierten Klassen wie IntegerField.
- Ich sollte nicht save() -Methode weder auf ResultClass, noch auf Serializer impl, weil ich nicht die Ergebnisse speichern werde (ich möchte nur auf Anfrage zurückgeben).
- Impl Serializer für verschachtelte Ergebnisse (erinnere Tupel der oben genannten Tupel).
- Ansicht erstellen, um Berechnungsergebnisse zurückzugeben.
- Ableitung von APIView.
- Brauchen Sie nur().
- In Get() CalcClass mit Params aus der Anfrage abgerufen, rufen Sie seine calc(), Get ResultClass, erstellen Serializer und übergeben Sie die ResultClass, Rückgabe Response (serializer.data).
- URLs
- Es gibt keine api Wurzel in meinem Fall. Ich sollte nur URLs haben, um verschiedene calc-Ergebnisse zu erhalten (calc mit diff params).
- Fügen Sie den Aufruf format_suffix_patterns für api-Browsing hinzu.
Habe ich etwas verpasst? Ist der Ansatz im Allgemeinen korrekt?
Hallo Gabriel! Vielen Dank für Ihre Antwort! Ich habe bereits umgesetzt, was ich nach meinem Plan brauche. Funktioniert gut! Ich benutzte den Serializer für bessere json Ausgabe. – Zakhar
Vielen Dank, es hat meinen Tag gerettet. Es sollte Teil der Dokumentation sein. – neelix
Ich habe versucht, diesem Vorschlag zu folgen, aber ich bekomme: "DjangoModelPermissions kann nicht auf eine Ansicht angewendet werden, die keine' .model' oder '.queryset' Eigenschaft hat.". Ich habe das genaue Beispiel ausprobiert. Könnte es etwas mit der aktuellen Version von django-rest-framework sein? – Orlando