Раньше я сталкивался с проблемами, пытаясь исправить rest_framework.serializers.ListSerializer.data
.Должно быть опечатка.Попытка повторной попытки и была успешно исправлена.Учитывая случай, many=True
воссоздает сериализатор как ListSerializer
Мне просто нужно было пропатчить свойство базового класса.
serialized_data = mocker.patch(
"rest_framework.serializers.ListSerializer.data",
new_callable=mocker.PropertyMock
)
Редактировать: более подробный ответ
Когда используется many=True
, метод __new__
на BaseSerializer
захватывает ваш класс и создает из него ListSerializer
, и поэтому мой объект отображается как ListSerializer
.Поскольку мы фактически получаем ListSerializer
вместо нашего определенного класса, патч не применяется к методу ListSerializer.data
.Соответствующие части исходного кода для BaseSerializer
ниже
class BaseSerializer(Field):
def __new__(cls, *args, **kwargs):
# We override this method in order to automagically create
# `ListSerializer` classes instead when `many=True` is set.
if kwargs.pop('many', False):
return cls.many_init(*args, **kwargs)
return super(BaseSerializer, cls).__new__(cls, *args, **kwargs)
@classmethod
def many_init(cls, *args, **kwargs):
"""
This method implements the creation of a `ListSerializer` parent
class when `many=True` is used. You can customize it if you need to
control which keyword arguments are passed to the parent, and
which are passed to the child.
Note that we're over-cautious in passing most arguments to both parent
and child classes in order to try to cover the general case. If you're
overriding this method you'll probably want something much simpler, eg:
@classmethod
def many_init(cls, *args, **kwargs):
kwargs['child'] = cls()
return CustomListSerializer(*args, **kwargs)
"""
allow_empty = kwargs.pop('allow_empty', None)
child_serializer = cls(*args, **kwargs)
list_kwargs = {
'child': child_serializer,
}
if allow_empty is not None:
list_kwargs['allow_empty'] = allow_empty
list_kwargs.update({
key: value for key, value in kwargs.items()
if key in LIST_SERIALIZER_KWARGS
})
meta = getattr(cls, 'Meta', None)
list_serializer_class = getattr(meta, 'list_serializer_class', ListSerializer)
return list_serializer_class(*args, **list_kwargs)