Sono nuovo al DRF. Ho letto i documenti API, forse è ignaro ma non sono riuscito a trovare un modo pratico per farlo.Django Rest Framework aggiornamento POST se esistente o creare
Ho un oggetto risposta che ha una relazione uno-a-uno con una domanda.
Sul lato anteriore usavo il metodo POST per creare una risposta inviata a API/risposte e il metodo PUT per aggiornare inviato ad es. api/risponde/24
Ma voglio gestirlo sul lato server. Trasmetterò solo un metodo POST a api/risposte e DRF controllerà in base a answer_id o question_id (poiché è uno a uno) se l'oggetto esiste. Se lo fa, aggiornerà quello esistente, se non lo farà creerà una nuova risposta.
Dove dovrei implementarlo, non riuscivo a capirlo. Sovrascrivere crea in serializzatore o in ViewSet o qualcos'altro?
Il mio modello, serializzatore e la vista sono come questi:
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',)
Non POST [modifica l'oggetto] (http://restcookbook.com/HTTP%20Methods/put-vs-post/) se ce n'è già uno (a condizione che l'ID sia menzionato nell'URL) ?. Dal link: "È abbastanza possibile, valido e persino preferito in alcune occasioni, usare PUT per creare risorse, o usare POST per aggiornare risorse_". – LaundroMat
Nessun articolo dice, se fornisci l'id nell'URL, usa PUT altrimenti usa POST. Quindi voglio usare il POST. Ma voglio aggiornarlo non cercando di creare se c'è già quell'istanza. E voglio che venga aggiornato parzialmente, quindi c'è anche quello. –
Hm - Devo averlo interpretato in modo errato. Vedo dai commenti dell'articolo che non sono da solo :) Forse questa [risposta SO precedente] (http://stackoverflow.com/a/18243587/308204) può aiutarti allora? – LaundroMat