ValueError при попытке создания через Django REST Framework - PullRequest
2 голосов
/ 21 июня 2019

Я получаю ValueError Cannot assign "[]": "Match.stats" must be a "Stats" instance.когда я пытаюсь создать совпадение с помощью API, доступного для просмотра, но могу создать его с помощью оболочки.

Если я удаляю HyperlinkedRelatedField из MatchSerializer, он может создать просто отлично.

models.py

class Player(models.Model):
    name = models.CharField(max_length=30)
    account = models.IntegerField()
    place = models.CharField(max_length=30)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='players')

    def __str__(self):
        return self.name


class Match(models.Model):
    game = models.IntegerField()
    length = models.IntegerField()
    win = models.BooleanField()
    player = models.ForeignKey(Player, on_delete=models.CASCADE, related_name='matches')

    def __str__(self):
        return str(self.game)



class Stats(models.Model):
    goals = models.IntegerField()
    assists = models.IntegerField()
    time = models.IntegerField()
    match = models.OneToOneField(Match, on_delete=models.CASCADE, related_name='stats')

    def __str__(self):
         return '{} {}'.format(str(self.goals), str(self.match))


class Team(models.Model):
    possession = models.IntegerField()
    goals = models.IntegerField()
    assists = models.IntegerField()
    extra = models.BooleanField(default=False)
    match = models.OneToOneField(Match, on_delete=models.CASCADE, related_name='teams')

    def __str__(self):
        return '{} - {}'.format(str(self.possession), str(self.match))

serializer.py

class UserSerializer(serializers.ModelSerializer):
    players = serializers.HyperlinkedRelatedField(many=True, view_name='players-detail', queryset=Player.objects.all())
    class Meta:
        model = User
        fields = ('id', 'username', 'email', 'first_name', 'last_name', 'players')


class PlayerSerializer(serializers.ModelSerializer):
    user = serializers.ReadOnlyField(source='user.username')
    matches = serializers.HyperlinkedRelatedField(many=True, view_name='matches-detail', queryset=Match.objects.all())
    class Meta:
        model = Player
        fields = ('id', 'name', 'account', 'place', 'user', 'matches')


class MatchSerializer(serializers.ModelSerializer):
    player = serializers.ReadOnlyField(source='player.name')
    stats = serializers.HyperlinkedRelatedField(many=True, view_name='stats-detail', queryset=Stats.objects.all())
    teams = serializers.HyperlinkedRelatedField(many=True, view_name='teams-detail', queryset=Team.objects.all())
    class Meta:
        model = Match
        fields = ('id', 'game', 'length', 'win', 'player', 'stats', 'teams')

class StatsSerializer(serializers.ModelSerializer):
    match = serializers.ReadOnlyField(source='match.game')
    class Meta:
        model = Stats
        fields = ('id', 'goals', 'assists', 'time', 'match')


class TeamSerializer(serializers.ModelSerializer):
    match = serializers.ReadOnlyField(source='match.game')
    class Meta:
        model = Team
        fields = ('id', 'possession', 'goals', 'assists', 'extra', 'match')

Я могу перейти к python manage.py shell и создать соответствие просто отлично.

>>>m = Match(game=12345, length=5674, win=True, player=player1) # a previously queried player 
>>>m.save()  

Я просто немного смущен тем, что происходит

1 Ответ

1 голос
/ 21 июня 2019

По умолчанию HyperlineRelatedField разрешают операции чтения и записи, поэтому я думаю, что вам нужно сделать ее доступной только для чтения:

class MatchSerializer(serializers.ModelSerializer):
    player = serializers.ReadOnlyField(source='player.name')
    stats = serializers.HyperlinkedRelatedField(view_name='stats-detail', read_only=True)
    teams = serializers.HyperlinkedRelatedField(view_name='teams-detail', read_only=True)
    class Meta:
        model = Match
        fields = ('id', 'game', 'length', 'win', 'player', 'stats', 'teams')

Такжевам не нужно добавлять many=True, потому что и команды, и статистика являются отношениями OneToOne.Таким образом, для каждого совпадения будет создана одна запись для обеих таблиц.

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