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

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Django Rest Framework – ошибка вложенного атрибута сериализатора в ответе

Сообщение Anonymous »

Интересно, может ли кто-нибудь помочь мне со следующей проблемой.
У меня есть такая сериализация:

Код: Выделить всё

class LineupPlayerSerializer(serializers.ModelSerializer):
id = serializers.UUIDField(write_only=True)
name = serializers.CharField(source='player.name', read_only=True)
positionType = serializers.CharField(source='player.positionType.name', read_only=True)
alternativePositions = serializers.CharField(source='player.alternativePositions.name', read_only=True, required=False, allow_blank=True)
shirtNumber = serializers.IntegerField(source='player.shirtNumber', 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 думает, что позицияOnPitch находится в модели Player, и я не могу понять, как это сделать. Когда я использую write_only=True для позицииOnPitch, он отправляет запрос OK, поэтому проблема возникает только при получении позицииOnPitch.
Мои модели:

Код: Выделить всё

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"
Кто-нибудь может понять, в чем может быть проблема? Я пробовал искать, но ничего похожего не нашел, может быть у меня совсем неправильная логика? Я пробовал использовать второй пилот, но это бесполезно, так как он считает, что в этом нет ничего плохого.
Любая помощь приветствуется. Я уже потратил на это несколько дней, попробовал кое-что, но получить позициюOnPitch просто не получилось. Если вам нужна дополнительная информация, дайте мне знать, пожалуйста.
Спасибо

Подробнее здесь: https://stackoverflow.com/questions/793 ... n-response
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»