如何正确修补ModelSerializer?

2024-05-13 15:26:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图在数据库中保存()我的数据。但是我得到一个错误{'Hero_id':[ErrorDetail<string='Hero with this Hero_id already exists.',='unique'>]}。 Models.py:

class Hero(models.Model):
    Hero_id = models.IntegerField(auto_created=True, primary_key=True, serialize=False, verbose_name='Hero_id')
    race = models.CharField(max_length=50, blank=True)
    age = models.IntegerField(blank=True)
    class_= models.CharField(max_length=50, blank=True)

Views.py:

class HeroSerializer(serializers.ModelSerializer):
    class Meta:
        model = Hero
        fields = ['Hero_id', 'race', 'age', 'class_']
        extra_kwargs = {
                'race': {
                    'required': False,
                    'allow_null':True
                 },
                'age': {
                    'required': False,
                    'allow_null':True
                 },
                'class_': {
                    'required': False,
                    'allow_null':True
                 }
            }

def PATCH(request):
if request.method == "PATCH":
      stream = io.BytesIO(request.body)
      data = JSONParser().parse(stream)
      serializer = HeroSerializer(data=data["json"],partial=True)
      if serializer.is_valid():
            serializer.save()
            return JsonResponse(data,save=False)
      return JsonResponse(serializer.errors)

我的传入数据始终包含英雄id。 例如:{"json":{"Hero_id":"4", "race":"orc"}}{"json":{"Hero_id":"4", "race":"Human", "age":"34", "class_":"archer"}} 问题: 1) 如何根据Hero_id修补数据库中的特定行? 2) 如何传递请求。数据?我总是得到一个错误“WSGIRequest”对象没有属性“data”。 3) 在我的案例中JSONParser().parse(io.BytesIO(request.body))request.data之间有什么区别吗


Tags: 数据idfalsetrueagedatamodelsrequest
1条回答
网友
1楼 · 发布于 2024-05-13 15:26:44

您需要将更新实例传递给序列化程序。没有它,djnago将尝试创建新对象:

@api_view 
def PATCH(request):
  instance = Hero.objects.get(Hero_id=request.data["json"]["Hero_id"])
  serializer = HeroSerializer(instance, data=data["json"], partial=True)
  if serializer.is_valid():
        serializer.save()
        return JsonResponse(data)
  return JsonResponse(serializer.errors)

顺便说一句,您可以使用^{}decorator来启用Django rest框架请求。在这种情况下,您不需要手动解析请求体

相关问题 更多 >