Django Rest Framework POST Aktualisieren, wenn Sie vorhandene oder erstellen
Ich bin neu in DRF.
Ich lese die API-docs, vielleicht ist es blind, aber ich konnte nicht finden einen einfachen Weg, es zu tun.
Habe ich ein Antwort-Objekt, das die eins-zu-eins-Beziehung mit einer Frage.
Auf der Vorderseite, die ich verwendet, um zu verwenden die POST-Methode zum erstellen einer Antwort geschickt-api/Antworten und PUT-Methode, um ein update gesendet, um z.B. api/Antworten/24
Aber ich möchte es behandeln, die auf der server-Seite. Werde ich nur senden Sie eine POST-Methode-api/Antworten und DRF überprüfen basierend auf answer_id oder question_id (da es eins zu eins), wenn das Objekt vorhanden ist.
Wenn es das tut, aktualisieren Sie die bestehenden, wenn nicht, wird es eine neue Antwort.
Soll, wo ich es umgesetzt habe, konnte ich nicht herausfinden. Überwiegendes anlegen in serializer oder in ViewSet oder etwas anderes?
Mein Modell, serializer und Ansicht wie diese:
class Answer(models.Model):
question = models.OneToOneField(Question, on_delete=models.CASCADE, related_name='answer')
answer = models.CharField(max_length=1,
choices=ANSWER_CHOICES,
null=True,
blank=True)
class AnswerSerializer(serializers.ModelSerializer):
question = serializers.PrimaryKeyRelatedField(many=False, queryset=Question.objects.all())
class Meta:
model = Answer
fields = (
'id',
'answer',
'question',
)
class AnswerViewSet(ModelViewSet):
queryset = Answer.objects.all()
serializer_class = AnswerSerializer
filter_fields = ('question', 'answer',)
Nein, der Artikel sagt, wenn du die id in der url, verwenden, LEGEN Sie sonst mit der POST. So will ich mit der POST. Aber ich möchte es zu aktualisieren, nicht versucht zu erstellen, wenn es schon die Instanz. Und ich will, dass es aktualisiert werden teilweise, so dass es ist auch dass.
Hm - muss ich haben, interpretiert das falsch. Ich sehe aus dem Artikel in die Kommentare, ich bin nicht alleine 🙂 Vielleicht vorherigen ALSO Antwort kann Ihnen helfen, zusammen dann?
Danke, aber diese Antwort sagt im Gegenteil: "Update: Kann nur durchgeführt werden, mit PUT in der folgenden Weise:..."
InformationsquelleAutor Ali Ankarali | 2016-06-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Antwort gepostet von @Nirri half mir auch, aber ich habe mehr gefunden, elegante Lösung mit Django QuerySet-API Verknüpfung:
Es tut genau das gleiche - wenn
Answer
zu, dassQuestion
nicht existiert, wird Sie erstellt, sonst - wieder wie vonquestion
Feld lookup.Diese Verknüpfung, jedoch nicht aktualisieren Sie das Objekt. QuerySet-API hat eine andere Methode für eine
update
operation, die aufgerufen wirdupdate_or_create
und erzielte in andere Antwort unten der thread.Wie bereits in der Antwort von K-Moe diese nicht aktualisieren Sie das Objekt mit den neuen Werten übergeben. stackoverflow.com/a/43393253/238166
Sicher ist es nicht. Es folgt mehr der traditionellen REST-Ansatz und dient als Referenz für weitere saubere Lösung, die mithilfe von Verknüpfungen, die sind Teil des API habe ich einen link gepostet. Natürlich werde ich auf die Antwort, um Missverständnisse zu vermeiden.
Viel klarer! 🙂
InformationsquelleAutor Damaged Organic
Leider Ihre zur Verfügung gestellten und akzeptierten Antworten keine Antwort auf Ihre ursprüngliche Frage, da Sie nicht aktualisieren Sie das Modell. Dies ist jedoch leicht erreicht, indem ein weiterer Vorteil der Methode: aktualisieren oder erstellen
Diese sollten ein
Answer
Objekt in der Datenbank, wenn man mitquestion=validated_data['question']
nicht vorhanden ist mit der Antwort entnommenvalidated_data['answer']
. Wenn es bereits vorhanden ist, django, wird seine Antwort Attributvalidated_data['answer']
.Wie bereits mit der Antwort der Nirri, sollte diese Funktion befinden sich im inneren der serializer. Wenn Sie die generische ListCreateView es wird rufen Sie die create-Funktion, nachdem Sie eine post-Anforderung gesendet wird, und generieren Sie die entsprechende Antwort.
InformationsquelleAutor K Moe
Ich würde das serialisierungsprogramme' create-Methode.
In es Sie könnte prüfen, ob die Frage (mit der ID von es Sie in der 'Frage' primary key-verwandten Bereich) hat bereits eine Antwort, und wenn es funktioniert, Holen Sie das Objekt und aktualisieren Sie diese, andernfalls erstellen Sie eine neue.
So dass die erste option gehen würde, so etwas wie:
Zweite option wäre zu prüfen, ob die Antwort mit der Antwort-id vorhanden ist.
Antwort-ID ' s nicht zeigen, bis in die validierten Daten von post-Anfragen, es sei denn, man verwendet eine Art workaround und manuell definiert Sie als read_only = false Felder:
Aber man sollte doch überdenken, Es gibt einen guten Grund die PUT-Methode und die POST-Methoden existieren als getrennte Wesen, und Sie zu trennen, um die Zugriffe auf das frontend.
InformationsquelleAutor xtrinch
Habe ich versucht, das serializer-Lösung, aber es scheint-Ausnahme ausgelöst, bevor das schlagen der serializer-Funktion
create(self, validated_data)
. Das ist, weil ich bin mitModelViewSet
(die wiederum mitclass CreatedModelMixin
). Eine weitere Studie zeigt, dass die Ausnahme ausgelöst hier:Da ich will, dass alle Funktionen von Rahmen, so dass ich lieber die Erfassung der Ausnahmen und die route über aktualisieren:
Meine app kann immer anrufen
POST /api/my_model/
mit Parameter (hier uuid = Primärschlüssel).Jedoch wäre es besser, wenn wir mit diesem in
update
Funktion?InformationsquelleAutor John Pang
Auch:
InformationsquelleAutor Sławomir Lenart