Django在QuerySet对象上调用save - 'QuerySet'对象没有'save'属性

26 投票
8 回答
58691 浏览
提问于 2025-04-16 18:52

我该怎么做才能让下面的代码正常工作呢?

player = Player.objects.get(pk=player_id)
game = Game.objects.get(pk=game_id)
game_participant = GameParticipant.objects.filter(player=player, game=game)
game_participant.save()

当这个对象已经存在于数据库中时,我会收到这样的错误:

'QuerySet' 对象没有 'save' 这个属性。

关于我的模型,GameParticipant 这个类有两个外键,分别指向 GamePlayer。我知道使用 filter 方法会返回一个查询集(QuerySet),但我不太确定怎么把它转换成 GameParticipant,或者说这样想是不是正确的?

class Player(models.Model):
    name = models.CharField(max_length=30)
    email = models.EmailField()

class Game(models.Model):
    game_date = models.DateTimeField()
    team = models.ForeignKey(Team)
    description = models.CharField(max_length=100, null=True, blank=True)
    score = models.CharField(max_length=10, null=True, blank=True)

class GameParticipant(models.Model):
    STATUS_CHOICES = (('Y','Yes'),('N','No'),('M','Maybe'))
    status = models.CharField(max_length=10, choices=STATUS_CHOICES)
    game = models.ForeignKey(Game)
    player = models.ForeignKey(Player)

或者有没有更好的方法来实现我想做的事情?比如用 .get() 代替 .filter(),但这样我又会遇到其他问题???

8 个回答

2

这个错误可能是因为把一个没有保存的对象赋值给了另一个对象的外部字段。

    for project in projects:
        project.day = day
    day.save()

正确的做法是:

    day.save()
    for project in projects:
        project.day = day
21

filter 方法会返回一个查询集。查询集不是一个单独的对象,而是一组对象,所以在查询集上调用 save() 方法是没有意义的。相反,你需要对查询集中的每一个单独对象进行保存:

game_participants = GameParticipant.objects.filter(player=player, game=game)
for object in game_participants:
    object.save()
27

你需要使用 update 方法,因为你要处理多个对象:

https://docs.djangoproject.com/en/2.0/topics/db/queries/#updating-multiple-objects-at-once

撰写回答