Сериализация DRF один ко многим - AttributeError из пропущенного поля - PullRequest
0 голосов
/ 05 июля 2018

Ошибка:

AttributeError в / stats / match

Получена ошибка AttributeError при попытке получить значение для поля players на сериализаторе MatchSerializer. Поле сериализатора может иметь неправильное имя и не соответствовать ни одному атрибуту или ключу в экземпляре Match. Исходный текст исключения: объект «Соответствие» не имеет атрибута «игроки».


Модели:

Каждый Match имеет 10 игроков.

class Match(models.Model):
    tournament = models.ForeignKey(Tournament, blank=True)
    mid = models.CharField(primary_key=True, max_length=255)
    mlength = models.CharField(max_length=255)
    win_rad = models.BooleanField(default=True)

class Player(models.Model):
    match = models.ForeignKey(Match, on_delete=models.CASCADE)
    playerid = models.CharField(max_length=255, default='novalue')
    # There is also a Meta class that defines unique_together but its omitted for clarity.

сериализаторы:

class PlayerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Player
        fields = "__all__"

class MatchSerializer(serializers.ModelSerializer):
    players = PlayerSerializer(many=True)
    class Meta:
        model = Match
        fields = ("mid","players")

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Проблема здесь в том, что Match модель не имеет атрибута с именем players, помните, что вы пытаетесь получить объекты обратной связи, поэтому вам нужно использовать players_set как поле, как говорит Джанго Документы .

Вы можете решить эту проблему за Два пути
1. Добавление параметра source к PlayerSerializer

class MatchSerializer(serializers.ModelSerializer):
    players = PlayerSerializer(many=True<b>, source='player_set')</b>
    class Meta:
        model = Match
        fields = ("mid", "players")

2. Изменить поле поиска

class MatchSerializer(serializers.ModelSerializer):
    <b>player_set</b> = PlayerSerializer(many=True)
    class Meta:
        model = Match
        fields = ("mid",<b>"player_set"</b>)
0 голосов
/ 05 июля 2018

MatchSerializer ищет атрибут players в экземпляре Match, но не может найти, и вы получаете следующую ошибку:

AttributeError at /stats/matches

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

В сериализаторе DRF параметр с именем source будет явно указывать, где искать данные. Итак, измените ваш MatchSerializer следующим образом:

class MatchSerializer(serializers.ModelSerializer):
    players = PlayerSerializer(many=True, source='player_set')
    class Meta:
        model = Match
        fields = ("mid", "players")

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...