DRFを初めて使用しています。 私はAPIドキュメントを読んでいますが、それは気にしないかもしれませんが、便利な方法を見つけることができませんでした。Django Rest Framework POSTが存在する場合は更新します。
質問に1対1の関係を持つ回答オブジェクトがあります。
フロントサイドでは、私はPOSTメソッドを使用して、api/answersに送信された回答を作成しました。 api/answers/24
しかし、私はそれをサーバー側で処理したいと思います。私はapi/answersにPOSTメソッドを送信し、オブジェクトが存在する場合、DRFはanswer_idまたはquestion_idに基づいてチェックします(1対1なので)。 もしそうであれば、それは既存のものを更新し、そうでなければ新しい回答を作成します。
私はそれを実装する必要がありますが、私は理解できませんでした。シリアライザやViewSetなどでcreateをオーバーライドしますか?
私のモデル、シリアライザおよびビューは、これらの通りです:
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',)
すでにオブジェクトが存在する場合は、[オブジェクトの編集](http://restcookbook.com/HTTP%20Methods/put-vs-post/)しないでください(URLにIDが記載されている場合)。リンクから:「可能な限り、有効であり、場合によってはPUTを使用してリソースを作成したり、POSTを使用してリソースを更新することも好ましい」 – LaundroMat
記事には、urlにidを指定した場合は、PUTを使用してください。そうでない場合は、POSTを使用してください。だから私はPOSTを使いたい。しかし、すでにそのインスタンスが存在する場合、作成しようとしていないものを更新する必要があります。私はそれを部分的に更新したいので、それもあります。 –
Hm - 私はそれを間違って解釈しているに違いない。私は記事のコメントから、私が一人ではないことを知っている:)おそらく、この[以前のSOの回答](http://stackoverflow.com/a/18243587/308204)はあなたに沿ってあなたを助けることができますか? – LaundroMat