Ich bin neu in DRF. Ich habe die API-Dokumentation gelesen, vielleicht ist sie mir nicht bewusst, aber ich konnte keinen praktischen Weg finden, dies zu tun.Django Rest Framework POST Update, wenn vorhanden oder erstellen
Ich habe ein Antwortobjekt, das eine Eins-zu-Eins-Beziehung mit einer Frage hat.
Auf der Vorderseite verwendete ich die POST-Methode, um eine Antwort an api/Antworten zu senden, und PUT-Methode zum Aktualisieren an z. api/Antworten/24
Aber ich möchte es auf der Serverseite behandeln. Ich werde nur eine POST-Methode an API/Antworten senden, und DRF wird basierend auf Antwort_ID oder Frage_ID prüfen (da es eins zu eins ist), wenn das Objekt existiert. Wenn dies der Fall ist, wird das vorhandene aktualisiert, wenn nicht, wird eine neue Antwort erstellt.
Wo ich es implementieren sollte, konnte ich nicht herausfinden. Überschreiben erstellen in Serializer oder in ViewSet oder etwas anderes?
Mein Modell, Serializer und Ansicht sind 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',)
Wird POST [bearbeiten Sie das Objekt] (http://restcookbook.com/HTTP%20Methods/put-vs-post/) nicht, wenn es bereits einen gibt (sofern die ID in der URL erwähnt wird) ?. Von dem Link: "_ Es ist durchaus möglich, gültig und sogar in einigen Fällen bevorzugt, PUT zu verwenden, um Ressourcen zu erstellen, oder POST zu verwenden, um Ressourcen zu aktualisieren _". – LaundroMat
Nein, der Artikel sagt, wenn Sie die ID in der URL angeben, verwenden Sie PUT, sonst verwenden Sie POST. Also ich möchte POST verwenden. Aber ich möchte, dass das Update nicht versucht zu erstellen, wenn es bereits diese Instanz gibt. Und ich möchte, dass es teilweise aktualisiert wird, also gibt es auch das. –
Hm - ich muss das falsch interpretiert haben. Ich sehe aus den Kommentaren des Artikels, dass ich nicht alleine bin :) Vielleicht kann dir diese [vorherige SO-Antwort] (http://stackoverflow.com/a/18243587/308204) dann weiterhelfen? – LaundroMat