我正在尝试使用Django rest-framework更新模型。
serializers.py
class MatchSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = MatchModel
fields = ("id", "player_1", "player_2")
models.py
class MatchModel(models.Model):
player_1 = models.CharField(max_length=256)
player_2 = models.CharField(max_length=256)
views.py
class MatchesViewSet(APIView):
...
def put(self, request, format=None):
serializer = self.serializer_class(data=json.loads(request.body))
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data)
请求生成如下:
match = {
"id": 1,
"player_1": "updatedP1",
"player_2": "updatedP2",
}
r = self.c.put("/api/matches", json.dumps(match), content_type="application/json")
但事情不断添加新匹配,而不是使用id = 1
更新现有匹配我做错了什么?
答案 0 :(得分:2)
如果希望serializer.save()
更新现有实例,则需要在实例化序列化程序类时传递它,例如:
def put(self, request, format=None):
data = json.loads(request.body)
instance = get_object_or_404(MatchModel, pk=data["id"])
serializer = self.serializer_class(instance, data=data)
...
查看Saving instances了解详情。
PS,您可能还想为单个匹配(例如/api/matches/1
)而不是单个/api/matches
使用单独的资源。