'аргумент manager_method() после ** должен быть отображением, а не строкой' при перегрузке вложенной ModelSerialiver.create(....)
Я хочу перегрузить метод ModelSerializer create() общим способом, используя инспекционные функции Django RestFramework. для проверки концепции на related_name из ForeingKey у меня есть следующие модели и соответствующий сериализатор.
models.py
class Country(models.Model):
pass
class People(models.Model):
country = models.ForeignKey(
to="myapp.Country",
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name="country_people"
)
serializer.py
class CountrySerializer(serializers.ModelSerializer):
country_people = PeopleSerializer(many=True)
def create(self, validated_data):
country_people_data = validated_data.pop("country_people", [])
instance = super().create(validated_data)
for cp_data in country_people_data:
cp_data["country"] = instance
self.get_fields()["country_people"].create(cp_data)
class Meta:
fields= "__all__"
model = Country
пример данных
# json data for country serializer
{
...,
"country_people":[
{...},
{...}
]
}
При вызове CountrySerializer.save() будет вызван CountrySerializer.create(), который также сохранит вложенные данные в таблице People.
Проблема в том, что я получаю следующую ошибку
ModelClass._default_manager.create(**validated_data) TypeError: django.db.models.manager.BaseManager._get_queryset_methods.<locals>.create_method.<locals>.manager_method() argument after ** must be a mapping, not str
использование People.create(**cp_data) работает, но это не решение в моем контексте
Я хочу решить эту проблему с помощью self.get_fields, потому что я хочу, чтобы он был генеративным и потому что PeopleSerializer может вложить другой сериализатор и так далее и тому подобное