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
可能是一个更好的主意。