[英]How to sum many fields in django
嗨,我想总结一下所有科目的学生学位,并将其存储到 TotalSub
TotalSub = (ArabicSub+EnglishSub+MathSub+GeographySub+SinceSub+ReliganSub)
这是我的 model
class StudentDgree(models.Model):
StdIDNumber = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')
GroupNumber = models.SmallIntegerField(null=True,default=0000)
StdName = models.CharField(max_length=250)
ArabicSub = models.SmallIntegerField(null=True,default=None)
EnglishSub = models.SmallIntegerField(null=True,default=None)
MathSub = models.SmallIntegerField(null=True,default=None)
GeographySub = models.SmallIntegerField(null=True,default=None)
SinceSub = models.SmallIntegerField(null=True,default=None)
ReliganSub = models.SmallIntegerField(null=True,default=None)
TotalSub = models.SmallIntegerField(null=True,default=None)
你在寻找这样的东西吗?
obj = StudentDgree.objects.get(StdIDNumber=1)
obj.TotalSub = obj.ArabicSub + obj.EnglishSub + obj.MathSub + obj.GeographySub + obj.SinceSub + obj.ReliganSub
obj.save()
作为一般的数据库实践,您不应该保存计算值,这可能会导致数据不一致。 相反,在 model 上编写一个属性,然后将该数据传递给您的模板。 但是,如果你想这样做,我会这样做。
使用属性装饰器:
class StudentDgree(models.Model):
StdIDNumber = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')
GroupNumber = models.SmallIntegerField(null=True,default=0000)
StdName = models.CharField(max_length=250)
ArabicSub = models.SmallIntegerField(null=True,default=None)
EnglishSub = models.SmallIntegerField(null=True,default=None)
MathSub = models.SmallIntegerField(null=True,default=None)
GeographySub = models.SmallIntegerField(null=True,default=None)
SinceSub = models.SmallIntegerField(null=True,default=None)
ReliganSub = models.SmallIntegerField(null=True,default=None)
@property
def total_sub(self):
return sum([self.ArabicSub, self.EnglishSub, self.MathSub, self.GeographySub, self.SinceSub, self.ReliganSub])
使用保存方法:
class StudentDgree(models.Model):
StdIDNumber = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')
GroupNumber = models.SmallIntegerField(null=True,default=0000)
StdName = models.CharField(max_length=250)
ArabicSub = models.SmallIntegerField(null=True,default=None)
EnglishSub = models.SmallIntegerField(null=True,default=None)
MathSub = models.SmallIntegerField(null=True,default=None)
GeographySub = models.SmallIntegerField(null=True,default=None)
SinceSub = models.SmallIntegerField(null=True,default=None)
ReliganSub = models.SmallIntegerField(null=True,default=None)
TotalSub = models.SmallIntegerField(null=True,default=None)
def save(self, *args, **kwargs):
self.TotalSub = sum([self.ArabicSub, self.EnglishSub, self.MathSub, self.GeographySub, self.SinceSub, self.ReliganSub])
return super().save(*args, **kwargs)
实际上你可以在过滤器上做到这一点
StudentDgree.objects.filter(StdIDNumber=1).annotate(
total_sub = F('ArabicSub') + F('EnglishSub') .....
).update(TotalSub=F('total_sub')
这将适当地更新记录
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.