【问题标题】:Django Rest-Framework Serializer ignoring model IDDjango Rest-Framework Serializer 忽略模型 ID
【发布时间】:2017-11-30 21:17:22
【问题描述】:

我正在尝试使用 Django rest-framework 更新模型。

序列化器.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 更新现有的匹配

我做错了什么?

【问题讨论】:

    标签: python django-rest-framework


    【解决方案1】:

    如果你想让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

    【讨论】:

      猜你喜欢
      • 2022-01-07
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      相关资源
      最近更新 更多