【发布时间】:2021-07-07 02:49:45
【问题描述】:
我是 DRF 的新手。 我阅读了 API 文档,也许很明显,但我找不到方便的方法。
我有一个Answer 对象,它与Question 具有一对一的关系。
在前端,我曾经使用 POST 方法创建一个发送到api/answers 的答案,并使用 PUT 方法来更新发送到例如api/answers/24
但我想在服务器端处理它。我只会向api/answers 发送一个POST 方法,DRF 将根据answer_id 或question_id(因为它是一对一的)检查对象是否存在。
如果是,它将更新现有答案,如果不是,它将创建一个新答案。
我不知道应该在哪里实现它。我应该在序列化程序或 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")
【问题讨论】:
-
如果已经有edit the object,则不会发布(如果 URL 中提到了 ID)?来自链接:“在某些情况下,使用 PUT 创建资源或使用 POST 更新资源是完全可能的、有效的甚至是首选的”。
-
没有文章说,如果您在 url 中提供 id,则使用 PUT 否则使用 POST。所以我想使用POST。但是我希望它更新而不是尝试创建是否已经存在该实例。我希望它部分更新,所以也有。
-
嗯——我一定是理解错了。我从文章的 cmets 中看到,我并不孤单 :) 也许这个 previous SO answer 可以帮助你呢?
-
谢谢,但答案恰恰相反:“更新:只能通过以下方式使用 PUT 执行:...”
标签: python django django-rest-framework