Django "NotImplementedError: `to_internal_value()` должно быть реализовано" при отправке запроса на исправление
Я пытаюсь получить обновленный нормализованный ресурс, когда я обновляю ресурс с помощью патча.
(Использование APIRequestFactory в моих тестах TestCase, например self.factory.patch)
LoadBaseSerializer наследует BaseSerializer и использует to_representation
. Я делаю это, чтобы вернуть настроенный сериализатор. Однако я продолжаю получать эту раздражающую ошибку
Запрос патча содержит {'carrier' : 2 }. Я ожидаю вернуть весь сериализованный ресурс, но, полагаю, это работает только для GET-запросов.
Как я могу заставить это работать для методов PATCH/POST?
Вид:
class LoadUDView(RetrieveUpdateDestroyAPIView):
serializer_class = NormalizedLoadSerializer
queryset = Load.objects.all()
Мой сериализатор выглядит следующим образом:
# custom serializer
class NormalizedLoadSerializer(LoadBaseSerializer):
# not working, still get error
def to_internal_value(self, data):
load_data = data['carrier']
return super().to_internal_value(load_data)
def to_representation(self, instance):
# dict values serialized using ModelSerializer
data = dict(
contacts=self.get_driver_contacts(instance.carrier),
drivers=self.get_drivers(instance.carrier),
income = IncomeSerializer(instance.income, read_only=True).data,
expense = ExpenseSerializer(instance.expense, read_only=True).data,
stops = StopSerializer(instance.stops, many=True, read_only=True).data,
load=LoadSerializer(instance, read_only=True).data,
income_line_items= self.get_income_line_items(instance),
expense_line_items= self.get_expense_line_items(instance),
addresses=self.get_addresses(instance)
)
return data
LoadBaseSerializer:
# inherit BaseSerializer and added helper functions
class LoadBaseSerializer(serializers.BaseSerializer):
def get_income_line_items(self, instance):
income = instance.income.income_line_items.all()
return IncomeLineItemSerializer(income, many=True).data
def get_expense_line_items(self, instance):
expense = instance.expense.expense_line_items.all()
return ExpenseLineItemSerializer(expense, many=True).data
def get_addresses(self, instance):
data = [stop.address for stop in instance.stops.all()]
return AddressSerializer(data, many=True).data
def get_driver_contacts(self, carrier):
data = [driver.contact for driver in carrier.drivers.all()]
return ContactSerializer(data, many=True).data
def get_drivers(self, carrier):
data = carrier.drivers.all()
return DriverSerializer(data, many=True).data