POST einer verschachtelten Daten und Liste von Bildern

9

Es gibt zwei Modelle: Product und Picture . Jedes Product kann mehrere Picture s haben. Ich habe Fragen, wenn ich ein Produkt mit POST erstellen möchte. Wie verschicken Sie ein verschachteltes Objekt, das eine ImageField-Liste enthält?

Das Product -Modell ist:

%Vor%

Das Picture -Modell ist:

%Vor%

Ich schreibe die serializer.py wie folgt:

%Vor%

Die Ansicht, die ich verwende, ist:

%Vor%

Ich registriere es in den URLs als:

%Vor%

Die Fragen sind:

  • Wie kann ich diese POST-API testen, da django-rest-framework mir sagt, dass "Listen derzeit nicht in HTML-Eingabe unterstützt werden"
  • Wie verwendet man JSON, um Product -Ressourcen mit mehreren Pictures zu POST zu senden. ODER Ich muss multipart Parser verwenden.
  • Wie schreibe ich cURL Befehl?
Scofield77 22.01.2015, 16:00
quelle

3 Antworten

2

Sie müssen mehrteiligen Parser verwenden, sobald Sie binäre Daten senden müssen Sie im Grunde nur Entscheidungen:

  1. schwächen Sie Ihren REST-Ansatz und machen Sie eine Ausnahme - & gt; Json kann keine Binärdaten speichern
  2. kodiere jede Binärdatei mit base64, behalte den json-Ansatz bei, aber du musst für jede Anfrage zusätzlich de / encodieren (nicht nativ unterstützt)

Ein Ansatz, der häufig zu sehen ist, besteht darin, eine (nicht ruhende) Ansicht zu erstellen, um einzelne / mehrere Dateien hochzuladen, die File oder Document Objekte erstellen (beim Upload wird eine ID zurückgegeben). Dann können Sie diese ID (s) verwenden, die eine andere Anfrage, in Ihrem Fall erstellen / aktualisieren Ihre Product .

Im Allgemeinen gibt es keinen einfachen Weg dies zu tun, weil json keine binären Daten unterstützt.

    
Johannes Reichard 28.09.2017 11:44
quelle
0

Sie können die manage.py-Shell verwenden. So:

%Vor%     
belek 04.07.2015 15:40
quelle
0

DRF macht das ganz einfach. Sie sind in der Nähe, Sie müssen ProductSerializer.create überschreiben, etwa so:

%Vor%

Es gibt ein vollständiges Beispiel in den Dokumenten, hier: Ссылка

Für Ihren curl -Befehl wird etwas wie folgt aussehen:

curl -X POST http://localhost:8000/products/ -H 'ContentType: application/json' -d '{"pictures": [{"description": "first one"}, {"description": "second one"}], "product_name": "foobar"}'

    
Symmetric 09.06.2017 19:10
quelle