简体   繁体   中英

How to sum many fields in django

Hi I want to sum a student degree for all subject like below and store it in to TotalSub

TotalSub = (ArabicSub+EnglishSub+MathSub+GeographySub+SinceSub+ReliganSub)

Here is my 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)

Are you looking for something like this?

obj = StudentDgree.objects.get(StdIDNumber=1)
obj.TotalSub = obj.ArabicSub + obj.EnglishSub + obj.MathSub + obj.GeographySub + obj.SinceSub + obj.ReliganSub

obj.save()

As a general database practice, you shouldn't save calculated values, it can lead to data inconsistencies. Instead, write a property on the model that does the addition and then pass that data to your templates. However, if you want to do it, this is how I would do both.

Using the property decorator:

 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])

Using the save method:

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)

Actually you can do that on filter

StudentDgree.objects.filter(StdIDNumber=1).annotate(
   total_sub = F('ArabicSub') + F('EnglishSub') .....
).update(TotalSub=F('total_sub')

That will update the record appropriately

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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