Это происходит потому, что вы ничего не возвращаете, когда сериализованные данные недействительны.
вы можете просто сделать это так, чтобы быть уверенным, что он будет возвращать что-либо во всех случаях.
@csrf_exempt
@api_view(["PUT"])
def update(request):
# if request.method == "PUT":
# You don't have to check for method, since you already defined it
# in api_view(...) decorator.
serializer = InvocesSerializer(data=request.data)
# Raises a ValidatinException which will be sent as a 400 response.
serializer.is_valid(raise_exception=True)
invoce = Invoces.objects.get(id=serializer.data["id"])
invoce.company_name = serializer.data["company_name"]
invoce.save()
return Response(serializer.data)
Лучшее решение
Я предлагаю вам использовать DRF UpdateAPIView
(Сделайте это способом DRF: D) , чтобы избежать подобных ошибок , а также чтобы не выполнять всю проверку и сериализацию вручную.
, например, следующим образом:
1. Оставьте свой InvocesSerializer
и создайте еще один для обновления company_name
# Inside serializers.py
class InvocesCompanyNameUpdateSerializer(serializers.ModelSerializer):
def to_representation(self, instance):
return InvocesSerializer(instance).to_representation(instance)
class Meta:
model = Invoces
fields = ('company_name',)
2. Создайте класс UpdateAPIView
для этого сериализатора
# Inside views.py
class InvoiceUpdateCompanyNameAPIView(UpdateAPIView):
http_method_names = ['put'] # This is only to allow PUT method on this view.
serializer_class = InvocesCompanyNameUpdateSerializer
queryset = Invoces.objects.all()
3. Теперь добавьте это представление с re_path
к вашим URL.
# Inside urls.py
urlpatterns = [
#
# you have to add "pk" url path variable, so DRF use it internally to identify
# which object you want to update.
re_path(r"api/v1/update-project/(?P<pk>[\d]+)/",
invocesView.InvoiceUpdateCompanyNameAPIView.as_view(),
name="update-project"),
#
]