Django rest one-to-many Получил AttributeError - PullRequest
0 голосов
/ 05 февраля 2020

Ошибка

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

Models.py

class TournamentTeam(models.Model):
    tournament = models.ForeignKey(Tournament, on_delete=models.SET_NULL, null=True)
    team = models.ForeignKey(TeamPlayer, on_delete=models.SET_NULL, null=True)

class Match(models.Model):
    name = models.TextField(blank=False, null=False)
    participant = models.ManyToManyField(TournamentTeam, through='MatchParticipant')

class MatchParticipant(models.Model):
    match = models.ForeignKey(Match, on_delete=models.SET_NULL, null=True, blank=True)
    team = models.ForeignKey(TournamentTeam, on_delete=models.SET_NULL, null=True, blank=True)
    score = models.CharField(max_length=255, null=True, blank=True)

Serializers.py

class MatchParticipantSerializer(serializers.ModelSerializer):

    class Meta:
        model = MatchParticipant
        fields = '__all__'


class MatchSerializer(serializers.ModelSerializer):
    participant_set=MatchParticipantSerializer(many=True)

    class Meta:
        model = Match
        fields = ('name','participant_set')

Просмотры .py

class MatchAPIView(ListAPIView):
    queryset = Match.objects.all()
    serializer_class = MatchSerializer

1 Ответ

1 голос
/ 05 февраля 2020

С вашими определениями модели ваша Match модель имеет следующие атрибуты:

  • participant - это менеджер запросов для запроса всех TournamentTeam s, связанных с этим Match (используя множественное число рекомендуется при определении поля m2m, поэтому лучше было бы participants). Например, match.participant.all()
  • matchparticipant_set - менеджер запросов для запроса сквозных экземпляров модели типа MatchParticipant. Например, match.matchparticipant_set.all().

В обратном направлении, поскольку вы не определили related_name в поле participant, у вас есть:

  • TournamentTeam.match_set для диспетчера запросов, чтобы получить связанные Match экземпляры
  • TournamentTeam.matchparticipant_set для MatchParticipant экземпляров.
...