使用get()django返回MultipleObjects

时间:2016-04-01 10:19:32

标签: python django django-rest-framework

我希望返回MultipleObjects,但我不确定如何继续收到此错误:

MultipleObjectsReturned at /clubs/
get() returned more than one Player -- it returned 2!

我希望它返回属于俱乐部的所有玩家的列表,但它只返回一个(如果我从我的数据库中删除所有其他玩家,但是当我添加团队的其余部分时,它会抛出此错误)I& #39;我不知道如何让get返回多个对象。

models.py

class Club(models.Model):
    name = models.CharField(max_length=4096)
    abbreviation = models.CharField(max_length=4096)
    def __str__(self):
        if self.player:
            return self.player.name
        return self.name

class Player(models.Model):
    name = models.CharField(max_length=4096)
    age = models.IntegerField()
    goals = models.IntegerField()
    club = models.OneToOneField(Club, null=True, related_name='player')

    def __str__(self):
        return self.name

views.py

class ClubViewSet(viewsets.ModelViewSet):
    queryset = Club.objects.order_by('name')
    serializer_class = ClubSerializer

class PlayerViewSet(viewsets.ModelViewSet):
    queryset = Player.objects.order_by('name')
    serializer_class = PlayerSerializer

serializer.py

class ClubSerializer(serializers.HyperlinkedModelSerializer):
   player = serializers.HyperlinkedRelatedField(
      many=False,
      read_only=True,
      view_name='player-detail'
   )
   class Meta:
      model = Club
      fields = ('url','name', 'abbreviation','player')

class PlayerSerializer(serializers.HyperlinkedModelSerializer):
   class Meta:
      model = Player
      fields = ('url', 'name', 'age', 'goals')

1 个答案:

答案 0 :(得分:3)

你有一个从一个球员到另一个球场的场地。

class Player(models.Model):
    club = models.OneToOneField(Club, null=True, related_name='player')

您还需要更改俱乐部的__str__方法,因为它目前使用self.player。我建议你使用俱乐部的名字,而不是包括所有的球员'名。

class Club(models.Model):
    ...
    def __str__(self):
        returns self.name

这意味着每个球员属于一个俱乐部,每个俱乐部属于一个球员。

使用外键更有意义。这意味着每个球员属于一个俱乐部,但许多球员可以属于同一个俱乐部。

class Player(models.Model):
    club = models.ForeignKey(Club, null=True, related_name='players')

您必须创建迁移并在进行此更改后运行它。

然后更新序列化程序以支持多个播放器。

class ClubSerializer(serializers.HyperlinkedModelSerializer):
    player = serializers.HyperlinkedRelatedField(
        many=True,
        read_only=True,
        view_name='player-detail'
    )
    ...