Как переопределить метод 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)
...

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