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.