繁体   English   中英

如何对 django 中的多个字段求和

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM