Как переопределить метод create для вложенного сериализатора для метода пост-запроса APIView?
Я пытаюсь переопределить метод create() для следующего сериализатора:
serializers.py
class TaggingSerializer(serializers.ModelSerializer):
tag = TagSerializer()
resource = ResourceSerializer()
gameround = GameroundSerializer()
user = CustomUserSerializer(required=False)
class Meta:
model = Tagging
fields = ('id', 'user', 'gameround', 'resource', 'tag', 'created', 'score', 'origin')
def create(self, validated_data):
"""Create and return a new tagging"""
tags_data = validated_data.pop('tags')
resources_data = validated_data.pop('resources')
gamerounds_data = validated_data.pop('gamerounds')
users_data = validated_data.pop('users')
tagging = Tagging.objects.create(**validated_data)
for tag_data in tags_data:
Tag.objects.create(tagging=tagging, **tag_data)
for resource_data in resources_data:
Resource.objects.create(tagging=tagging, **resource_data)
for gameround_data in gamerounds_data:
Gameround.objects.create(tagging=tagging, **gameround_data)
for user_data in users_data:
User.objects.create(tagging=tagging, **user_data)
return tagging
def to_representation(self, data):
data = super().to_representation(data)
return data
Вот объект JSON, который я пытаюсь отправить:
{
"user": "creator",
"gameround": 1,
"resource": 602,
"tag": "Redtagtestpost",
"created": "2022-12-12T15:19:49.031000Z",
"score": 0,
"origin": ""
}
Однако я продолжаю получать различные типы ошибок "JSON parse..." в Postman.
Одна ошибка, которую я часто получаю:
{"user":{"non_field_errors":["Invalid data. Expected a dictionary, but got str."]},"gameround":{"non_field_errors":["Invalid data. Expected a dictionary, but got int."]},"resource":{"non_field_errors":["Invalid data. Expected a dictionary, but got int."]},"tag":{"non_field_errors":["Invalid data. Expected a dictionary, but got str."]}}
Я пробовал использовать различные поля для других моделей, но ничего не помогает.
Я подозреваю, что мне каким-то образом нужно получить доступ к данным из запроса и сохранить их в нужном поле, например, только имя пользователя или указать, что это id геймера, который находится в JSON, который я передаю, но я не знаю, как это сделать и не смог найти ничего об этом в Интернете.
Добавление этого в мой сериализатор решило мою проблему:
class TaggingSerializer(serializers.ModelSerializer):
tag_id = serializers.PrimaryKeyRelatedField(queryset=Tag.objects.all(),
required=False,
source='tag',
write_only=False)
resource_id = serializers.PrimaryKeyRelatedField(queryset=Resource.objects.all(),
required=True,
source='resource',
write_only=False)
gameround_id = serializers.PrimaryKeyRelatedField(queryset=Gameround.objects.all(),
required=False,
source='gameround',
write_only=False)
user_id = serializers.PrimaryKeyRelatedField(queryset=CustomUser.objects.all(),
required=False,
source='user',
write_only=False)
...