Django Rest-Framework Serializer忽略模型ID

时间:2017-11-30 21:17:22

标签: python django-rest-framework

我正在尝试使用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

更新现有匹配

我做错了什么?

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使用单独的资源。