Python Django/DRF-prefetch_related()返回所有对象,但没有正确匹配外键关系?

Python Django/DRF-prefetch_related()返回所有对象,但没有正确匹配外键关系?,python,django,rest,django-rest-framework,prefetch,Python,Django,Rest,Django Rest Framework,Prefetch,嘿,伙计们,我的端点遇到了问题。我一直在尝试使用返回Player.objects.prefetch_related('playerstatistic_set')来返回与playerstatistic模型中的对象匹配的Player对象。PlayerStatistic表当前只有一行,因此player_id=1应该是唯一返回的一行,但当前prefetch_related()返回所有player对象 我试着进入PlayerStatistic模型并添加一个相关的名称,如so- player=models.

嘿,伙计们,我的端点遇到了问题。我一直在尝试使用
返回Player.objects.prefetch_related('playerstatistic_set')
来返回与playerstatistic模型中的对象匹配的Player对象。PlayerStatistic表当前只有一行,因此player_id=1应该是唯一返回的一行,但当前prefetch_related()返回所有player对象

我试着进入PlayerStatistic模型并添加一个相关的名称,如so-

player=models.ForeignKey(player,on\u delete=models.CASCADE,related\u name='player\u stats')
并将预取更改为prefetch\u related('player\u stats'),但这仍然只返回所有player对象

模型-


class Player(models.Model):
    # class for Player model
    name = models.CharField(max_length=100)
    team = models.ForeignKey(Team, on_delete=models.CASCADE)


class Game(models.Model):
    # class for Game model

    home_team = models.ForeignKey(Team, related_name='home_games',
                                     on_delete=models.CASCADE)
    away_team = models.ForeignKey(Team, related_name='away_games',
                                     on_delete=models.CASCADE)
    date = models.DateField()


class PlayerStatistic(models.Model):
    # class for individual player statistics

    game = models.ForeignKey(Game, on_delete=models.CASCADE)
    player = models.ForeignKey(Player, on_delete=models.CASCADE)
    team = models.ForeignKey(Team, on_delete=models.CASCADE)
    points = models.IntegerField()
    assists = models.IntegerField()
    rebounds = models.IntegerField()

我的玩家视图中的我的get_queryset函数-

class PlayerViewSet(viewsets.ModelViewSet):
    # ViewSet to display Players

    queryset = Player.objects.all()
    serializer_class = PlayerSerializer

    def get_queryset(self):
        return queryset.prefetch_related('playerstatistic_set')

当然,在我的播放器序列化程序中,我也尝试将PlayerStatistic序列化程序嵌套在其中,但无论是否有嵌套序列化程序,结果似乎都是一样的

{id: 1, game_id: 1, player_id: 1, team_id: 1, points: 20, assists: 10, rebounds: 2}
该行是PlayerStatistic中唯一的一行,因此应该返回Player_id=1的Player对象,但返回所有行(12行)

编辑-下面的序列化程序-


class PlayerStatisticSerializer(serializers.ModelSerializer):
    # Serializer for player statistics object

    class Meta:
        model = PlayerStatistic
        fields = '__all__'


class PlayerSerializer(serializers.ModelSerializer):
    # Serializer for Player objects
    playerstatistic = PlayerStatisticSerializer(many=True, read_only=True)

    class Meta:
        model = Player
        fields = '__all__'


您可能对预回迁的功能感到困惑,在您的示例中,一切都按预期工作
Player.objects.all()
此操作返回所有Player对象,此
queryset.prefetch\u related('playerstatistic\u set')
不会更改查询结果,只会作为查询优化器预取相关对象

如果您只想查询具有玩家统计信息的玩家,则必须采用另一种方法,即选择玩家统计信息并在
PlayerStatisticSerializer
中使用玩家作为嵌套序列化程序


另一种快速实现代码库所需功能的方法是使用
.filter
方法删除没有
playerstatistic\u集的所有用户

def get_queryset(self):
    return queryset.prefetch_related('playerstatistic_set').filter(playerstatistic_set__isnull=False)

您可能对预回迁的功能感到困惑,在您的示例中,一切都按预期工作
Player.objects.all()
此操作返回所有Player对象,此
queryset.prefetch\u related('playerstatistic\u set')
不会更改查询结果,只会作为查询优化器预取相关对象

如果您只想查询具有玩家统计信息的玩家,则必须采用另一种方法,即选择玩家统计信息并在
PlayerStatisticSerializer
中使用玩家作为嵌套序列化程序


另一种快速实现代码库所需功能的方法是使用
.filter
方法删除没有
playerstatistic\u集的所有用户

def get_queryset(self):
    return queryset.prefetch_related('playerstatistic_set').filter(playerstatistic_set__isnull=False)

请张贴您的serializers@aviKKi我已将序列化程序编辑到我的帖子中。请发布您的serializers@aviKKi我已经把连载器编辑到我的帖子里了。嘿,谢谢你的回复!我这样做是因为我最终需要返回带有日期查询参数的玩家对象,这些参数过滤游戏模型中的特定日期,然后它再次过滤查询集(如果它们存在于PlayerStatistic中)。比如nba/球员?日期=09212019。我可以让日期过滤工作,但只是不能预取。不管怎样,我尝试了你的函数,但我得到了一个错误,上面写着“FieldError at/nba/players/无法将关键字'playerstatistic\u set'解析到field中。选择包括:id、name、playerstatistic、team、team\u id”以及“当你说它只预取相关对象时,因为playerstatistic在它的表中只有一行,例如”{id:1,比赛id:1,球员id:1,球队id:1,得分:20,助攻:10,篮板:2}”由于其模型中的foreignkey关系,不应将其称为与该玩家匹配,并且仅返回该玩家对象?无论如何,我认为我可以通过一种迂回的方式来破解我最初的意图?玩家对象=玩家统计对象。值列表('player\u id',flat=True)返回玩家对象。过滤器(id\uuuu in=玩家id)嘿,谢谢你的回复!我这样做是因为我最终需要返回带有日期查询参数的玩家对象,这些参数会过滤游戏模型中的特定日期,然后它会再次过滤查询集(如果它们存在于PlayerStatistic中)。类似于nba/players?date=09212019。我可以让日期过滤工作,但只需n预回迁。不管怎样,我尝试了你的函数,但我得到了一个错误,上面写着“FieldError at/nba/players/无法将关键字'playerstatistic_set'解析到字段中。选项包括:id、name、playerstatistic、team、team_id”以及“当你说它只预回迁相关对象时,因为playerstatistic在它的表中只有一行,例如”{id:1,比赛id:1,球员id:1,球队id:1,得分:20,助攻:10,篮板:2}”由于其模型中的foreignkey关系,不应将其称为与该玩家匹配,并且仅返回该玩家对象?无论如何,我认为我可以通过一种迂回的方式来破解我最初的意图?玩家对象=玩家统计对象。值列表('player\u id',flat=True)返回玩家对象。过滤器(id\uuuu in=玩家id)