Обновление поля в django rest framework - PullRequest
0 голосов
/ 21 января 2020

У меня есть класс с именем Customer:

class Customer(models.Model):
   name   = models.CharField(max_length=250)
   status = models.IntegerField()

И сериализатор:

class CustomerSerializer(serializers.ModelSerilizer):
    class Meta:
    model = Customer
    fields = '__all__'

Теперь, как я могу изменить / обновить только поле состояния, используя метод POST. Я использую функцию базового просмотра здесь. Я хочу получить значение, например:

{
     "status": 1
}

Ответы [ 3 ]

1 голос
/ 21 января 2020

Это было бы намного проще, если бы вы использовали представления на основе классов. Вы можете легко создать UpdateStatusView, который обновляет RetrieveUpdateAPIView, отправив запрос patch.

Однако, поскольку вы используете представления на основе функций, я все равно рекомендую вам использовать запрос PATCH чем запрос POST, это даст лучшую самодокументацию.

def update_status_request(request, id):
    if request.method == 'PATCH':
        customer = Customer.objects.get(pk=id)
        customer.status = request.data.get('new_status')
        customer.save()
        return JsonResponse({'message': 'Status has been updated'}, status=200)

Вы также можете сделать дополнительную проверку и попробовать ... кроме.

0 голосов
/ 21 января 2020

Для этой цели вы можете использовать viewset.

View :

from rest_framework import viewset

class CustomerViewSet(viewset.ModelViewSet):
    serializer_class = CustomerSerializer

Url :

path('customer/update/<int:pk>', CustomerViewSet.as_view({'post': 'update'})),
0 голосов
/ 21 января 2020

почему вы хотите, чтобы пользовательский метод публикации обновлял данные, так как вы обновляете, вы можете использовать пользовательский патч



class CustomerUpdateSerializer(serializers.ModelSerializer):
   class Meta:
       model = Customer
       fields = ('status',)


from rest_framework.decorators import api_view
from rest_framework import response

@api_view(methods=['post', "patch"])
def api_function(request, *args, **kwargs):
   change instance logic according to u
   instance  = Customer.objects.get()
   if request.method == "POST":
     # post is used for create data so i did for that for update use path
     serializer = CustomerSerializer(data=request.data)
   else:
      serializer = CustomerUpdateSerializer(instance=instance, data=request.data)
   if serializer.is_valid(raise_exceptions=True):
      serializer.save()
  return response.Response(serializer.data)

...