【发布时间】:2019-07-24 14:52:39
【问题描述】:
我正在尝试在 Django 中实现一个琐事游戏后端。我有几个模型,但我会提到其中两个,它们是 Score 和 Player。
这里是Player的重要部分:
class Player(BaseModel, AbstractUser):
overall_score = models.PositiveIntegerField(default=0)
class Meta:
ordering = ['-overall_score']
这是Score的重要部分:
class Score(BaseModel):
score = models.PositiveSmallIntegerField()
player = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='scores')
def save(self, force_insert=False, force_update=False, using=None,
update_fields=None):
self.player.overall_score += self.score
Score 和Player 中还有其他字段,但我没有提及。
我想做的是让玩家解决一个测验,在将单个测验分数保存到数据库后,我想计算所有时间的总分,即他所有分数的总和.这只是一个总和,而不是一个平均值。
我的保存方法的实现是否正确?
我担心保存过程会因任何原因而失败,但overall_score 已经更新了。另外,我担心如果我使用聚合,这将不是一个有效的方法,因为每次用户访问排行榜时,都会计算总和,这可以通过保存总和来避免,所以我们避免每次对所有分数求和时间,对吗?
编辑 1: 我尝试按照Doodle 的建议使用信号来实现。但是,代码不起作用并给我一个错误:
TypeError:+= 不支持的操作数类型:“int”和“DeferredAttribute”
这是我的signals.py代码:
from django.db.models.signals import post_save
from django.dispatch.dispatcher import receiver
from .models import Score
@receiver(post_save, sender=Score)
def create_score(sender, instance, **kwargs):
instance.player.overall_score += instance.score
instance.player.save()
我尝试通过多种方式修复错误,但都无法解决。
【问题讨论】:
-
看看docs.djangoproject.com/en/2.2/topics/signals你会有一些想法,如果仍然需要一些解释,请评论
-
@Doodle 我用我的实现用你建议的信号编辑了我的问题。但是,它不起作用。
标签: django django-models django-aggregation