Django Rest Framework - ошибка вложенного атрибута сериализатора в ответе

Хотелось бы узнать, может ли кто-нибудь помочь мне со следующей проблемой.

У меня есть сериализации следующего вида:

class LineupPlayerSerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(write_only=True)
    name = serializers.CharField(read_only=True)
    positionType = serializers.CharField(read_only=True)
    alternativePositions = serializers.CharField(read_only=True, required=False, allow_blank=True)
    shirtNumber = serializers.IntegerField(read_only=True, required=False, allow_null=True)
    positionOnPitch = serializers.IntegerField(required=True)

    class Meta:
        model = LineupPlayer
        fields = ['id', 'positionType', 'alternativePositions', 'name', 'shirtNumber', 'positionOnPitch']

    def create(self, validated_data):
        player_id = validated_data.pop('id')
        player = Player.objects.get(id=player_id)
        position_on_pitch = validated_data.pop('positionOnPitch')
        lineup = validated_data.pop('lineup')

        lineup_player = LineupPlayer.objects.create(lineup=lineup, player=player, positionOnPitch=position_on_pitch)
        return lineup_player

class LineupSerializer(serializers.ModelSerializer):
    players = LineupPlayerSerializer(many=True)

    class Meta:
        model = Lineup
        fields = ['id', 'formation', 'players']

    def create(self, validated_data):
        try:
            players_data = validated_data.pop('players')
            lineup = Lineup.objects.create(**validated_data)

            for player_data in players_data:
                player_data['lineup'] = lineup
                LineupPlayerSerializer().create(player_data)
            
            return lineup
        except Exception as e:
            print(f"Error: {e}")
            raise e

Однако, когда я отправляю запрос, я получаю ошибку атрибута:

Got AttributeError when attempting to get a value for field `positionOnPitch` on serializer `LineupPlayerReadSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `Player` instance.
Original exception text was: 'Player' object has no attribute 'positionOnPitch'.

По какой-то причине Django считает, что positionOnPitch находится в модели Player, и я не могу понять, как это сделать. Когда я использую write_only=True для positionOnPitch, он отправляет запрос нормально, так что проблема возникает только при получении positionOnPitch.

Мои модели:

class Lineup(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    formation = models.CharField(max_length=10)
    players = models.ManyToManyField(Player, through='LineupPlayer', through_fields=('lineup', 'player'))

    def __str__(self):
        return self.formation
    
    class Meta:
        verbose_name = "Lineup"
        verbose_name_plural = "Lineups"

class LineupPlayer(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    lineup = models.ForeignKey(Lineup, on_delete=models.CASCADE, related_name='lineup')
    player = models.ForeignKey(Player, on_delete=models.CASCADE, related_name='player')
    positionOnPitch = models.PositiveSmallIntegerField()

    def __str__(self):
        return f"{self.player.name} in {self.lineup.formation}"
    
    class Meta:
        verbose_name = "Lineup Player"
        verbose_name_plural = "Lineup Players"

и модель игрока:

class Player(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=50)
    shirtNumber = models.SmallIntegerField(default=None, blank=True, null=True)
    positionType = models.ForeignKey(Position, on_delete=models.CASCADE, related_name='positionType')
    alternativePositions = models.ForeignKey(Position, on_delete=models.CASCADE, blank=True, null=True ,related_name='alternativePositions')
    active = models.BooleanField(default=True)
    injured = models.BooleanField(default=False, blank=True)

    def __str__(self):
        return self.name
    
    class Meta:
        verbose_name = "Player"
        verbose_name_plural = "Players"

Может ли кто-нибудь понять, в чем может быть проблема? Я пробовал искать, но не смог найти ничего похожего, может быть, моя логика совершенно неправильная? Я пробовал использовать copilot, но это не помогло, так как он считает, что все в порядке. Любая помощь более чем приветствуется. Я потратил на это уже несколько дней, перепробовал несколько вещей, но получить positionOnPitch просто не получается. Если вам нужна дополнительная информация, дайте мне знать, пожалуйста. Спасибо

Моя проблема заключалась в том, что я не использовал источник для своего LineupSerializer. После добавления этого проблема была решена, и сериализатор получил доступ ко всем объектам, включая внешние ключи в моих моделях:

class LineupSerializer(serializers.ModelSerializer):
    players = LineupPlayerSerializer(source='lineup',many=True)
Вернуться на верх