我正在制作一个竞赛网站,我有一个像这样的模型
class Participant(models.Model):
def __unicode__(self):
return "Participant: " + str(self.uuid)
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
participant = models.CharField(max_length=30, blank=False)
redditusername = models.CharField("Reddit Username",max_length=21)
slackusername = models.CharField("Slack Username", max_length=21)
challengeone = models.CharField("Points for challenge 1", max_length=30,blank=False)
challengetwo = models.CharField("Points for challenge 2", max_length=30,blank=False)
challengethree = models.CharField("Points for challenge 3", max_length=30,blank=False)
challengefour = models.CharField("Points for challenge 4", max_length=30,blank=False)
challengefive = models.CharField("Points for challenge 5", max_length=30,blank=False)
totalpoints = models.CharField("Points for all challenges ", max_length=30,blank=False)
我知道这是一个糟糕的设计。我必须手动输入点数。计算点,然后将它们添加到totalpoints
。我的问题是我如何组合挑战者,两个,三个,四个,五个并得到总分,并有一个字段totalpoints
,其中字段点自动添加到该字段
答案 0 :(得分:2)
您可以使用override the models' save
方法。
这样的事情:
class Participant(models.Model):
#... blah
def save(self, *args, **kwargs):
self.totalpoints = self.challengeone + self.challengetwo #+ ...
super(Participant, self).save(*args, **kwargs)
现在,每次调用save
方法时,它都会自动生效。
由于您有blank=False
(这是默认值,因此您不必指定它) - 这可确保数据库在插入时不会失败。
另一种可以解决这个问题的方法是使用具有相同净效应但通过信号实现的django's presave
signal
答案 1 :(得分:1)
您可以在模型中使用@property decorater来计算结果。 类似的东西:
@property
def totalpoints():
return <Your Query here>
现在,如果您不希望每次检索totalpoints
时都进行查询,可以使用名为post_save()
的Django信号方法
您可以阅读有关here的内容。每当您指定的模型类中的任何位置都有更新时,将调用此方法,并且结果可以存储在常规的整数类型字段totalpoints
中。