Python 使用get()django返回多个对象

Python 使用get()django返回多个对象,python,django,django-rest-framework,Python,Django,Django Rest Framework,我希望返回多个对象,但我不确定如何返回,因为我一直收到此错误: MultipleObjectsReturned at /clubs/ get() returned more than one Player -- it returned 2! 我希望它返回一个属于俱乐部的所有球员的列表,但它只返回一个(如果我从数据库中删除所有其他球员,但当我添加团队的其他成员时,它会抛出此错误),我不确定如何使get返回多个对象 models.py class Club(models.Model): n

我希望返回多个对象,但我不确定如何返回,因为我一直收到此错误:

MultipleObjectsReturned at /clubs/
get() returned more than one Player -- it returned 2!
我希望它返回一个属于俱乐部的所有球员的列表,但它只返回一个(如果我从数据库中删除所有其他球员,但当我添加团队的其他成员时,它会抛出此错误),我不确定如何使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
序列化程序.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')

从一个球员到另一个俱乐部,你有一个一对一的场地

class Player(models.Model):
    club = models.OneToOneField(Club, null=True, related_name='player')
您还需要更改俱乐部的
\uu str\uu
方法,因为它当前使用
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'
    )
    ...

使用而不是get。@SteinarLima在这种情况下没有太大帮助——OPs代码中没有
get()
。强制使用Unicode:需要字符串或缓冲区,NoneType发现我现在收到了这个错误抱歉,我忘了现在我必须更改str来获取queryset。我不建议将玩家包括在
\uu str\uuu
方法中。使用
返回self.name
可能是一个更好的主意。