【问题标题】:change specific field of an object using POST method django rest api使用 POST 方法 django rest api 更改对象的特定字段
【发布时间】:2021-05-19 00:43:51
【问题描述】:

我正在使用 djangorestframework。我希望能够使用 POST 方法更改我的对象的特定字段。有人可以帮忙吗?我不知道该怎么做。 这是我的模型:

class Employee(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    gender = models.CharField(max_length=10)
    national_code = models.CharField(max_length=11)
    personal_code = models.CharField(max_length=15)
    phone_number = models.CharField(max_length=11)
    address = models.CharField(max_length=50)
    married = models.BooleanField()
    age = models.IntegerField()
    wage = models.IntegerField()

    def __str__(self):
        return self.first_name + ' ' + self.last_name

例如,我希望能够使用这样的 url 将我的一名员工的工资(个人代码 123)更改为新工资 500000:

POST /myupdate/123/500000

【问题讨论】:

  • 不建议像工资一样通过 url 发送数据,最好在请求中将其作为数据发送。而且对于更新,您必须使用 put 或 patch not post。
  • @Mastisa 是的。我看到的所有例子都是补丁或放置。但在我的项目中,它特别要求对这个 url 使用 post 方法。这甚至可以做到吗??
  • 使用 http 方法可以做任何事情,但有些违反规则。
  • @Mastisa right.顺便说一句,非常感谢您的帮助:)

标签: django api django-models django-rest-framework


【解决方案1】:

让我们举个简单的例子:

models.py

class Employee(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

序列化器.py

class EmployeeSerializer(serializer.Serializer):
    first_name = serializer.CharField(max_lenght=50)
    last_name = serializer.CharField(max_lenght=50)
    
    def update(self, instance, validated_data):
        instance.first_name = validated_data.get('first_name', instance.first_name)
        instance.last_name = validated_data.get('last_name', instance.last_name)
    instance.save()
    return instance

views.py

class UpdateEmployeeView(generics.UpdateAPIView):
    serializer_class = EmployeeSerializer
    model = Employee

    def put(self, request, id):
        try:
            instance = self.model.objects.get(id=id)
            serialized_data = self.get_serializer(instance, data=request.data)
            if serialized_data.is_valid(raise_exception=True):
                self.perform_update(serialized_data)
                return HttpResponse(json.dumps(serialized_data.data), content_type="application/json")
        except ValidationError as e:
                return HttpResponse(e.detail, status=400, content_type="application/json")

    def patch(self, request, id):
        try:
            instance = self.model.objects.get(id=id)
            serialized_data = self.get_serializer(instance, data=request.data, partial=True)
            if serialized_data.is_valid(raise_exception=True):
                self.perform_update(serialized_data)
                return HttpResponse(json.dumps(serialized_data.data), content_type="application/json")
        except ValidationError as e:
                return HttpResponse(e.detail, status=400, content_type="application/json")

urls.py

path('employee/<int:id>/', UpdateEmployeeView.as_view())

【讨论】:

    猜你喜欢
    • 2013-11-12
    • 1970-01-01
    • 2017-02-19
    • 2021-07-09
    • 2021-04-05
    • 2021-11-05
    • 1970-01-01
    • 2020-07-22
    • 2019-05-15
    相关资源
    最近更新 更多