'аргумент 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 может вложить другой сериализатор и так далее и тому подобное

Вернуться на верх