I'm trying to perform math operation (specifically addition) with the contents of integer fields on my django models
Question:
I’m trying to perform math operation (specifically addition) with the values of integer fields on my django models but i kept getting this warning even before running the program:
"Class ‘IntegerField’ does not define ‘add‘, so the ‘+’ operator cannot be used on its instances"
this is my django model code:
class Applicants(models.Model):
fname = models.CharField(max_length=255)
lname = models.CharField(max_length=255)
number = models.CharField(max_length=255)
email = models.CharField(max_length=255)
gender = models.CharField(max_length=255)
p_course = models.CharField(max_length=255)
o_course = models.CharField(max_length=255)
grade1 = models.IntegerField(max_length=255)
grade2 = models.IntegerField(max_length=255)
grade3 = models.IntegerField(max_length=255)
grade4 = models.IntegerField(max_length=255)
grade5 = models.IntegerField(max_length=255)
grade6 = models.IntegerField(max_length=255)
total_grade = grade1 + grade2 + grade3 + grade4 + grade4 + grade5
Answers:
class Applicants(models.Model):
fname = models.CharField(max_length=255)
lname = models.CharField(max_length=255)
number = models.CharField(max_length=255)
email = models.CharField(max_length=255)
gender = models.CharField(max_length=255)
p_course = models.CharField(max_length=255)
o_course = models.CharField(max_length=255)
grade1 = models.IntegerField()
grade2 = models.IntegerField()
grade3 = models.IntegerField()
grade4 = models.IntegerField()
grade5 = models.IntegerField()
grade6 = models.IntegerField()
@property
def get_sum_of_grades(self):
total_grade = self.grade1 + self.grade2 + self.grade3 + self.grade4 + self.grade4 + self.grade5
return total_grade
Model.clean()¶
This method should be used to provide custom model validation, and to
modify attributes on your model if desired. For instance, you could
use it to automatically provide a value for a field, or to do
validation that requires access to more than a single field (source)
As described here, you should implement a clean method to your model:
class Applicants(models.Model):
fname = models.CharField(max_length=255)
lname = models.CharField(max_length=255)
number = models.CharField(max_length=255)
email = models.CharField(max_length=255)
gender = models.CharField(max_length=255)
p_course = models.CharField(max_length=255)
o_course = models.CharField(max_length=255)
grade1 = models.IntegerField()
grade2 = models.IntegerField()
grade3 = models.IntegerField() # btw Integerfields don't have `max_lenght`
grade4 = models.IntegerField()
grade5 = models.IntegerField()
grade6 = models.IntegerField()
total_grade = models.IntegerField()
def clean(self):
super().clean()
self.total_grade = sum([self.grade1, self.grade2, self.grade3, self.grade4, self.grade4, self.grade5])
For sure that total_grade
field will be shown in a form if you choose to use a models.ModelForm
but you can go for exclude = ['total_grade']
to hide it. Be careful, the result of the computation does not reach "normal" form validation, as it runs before within the statement super().clean()
It turns out that the input received from HTML comes as string.
I had to convert each grade in the views.py file
from request.POST['grade1']
to int(request.POST['grade1'])
for each of the grades and used the self.grade1… method in models.py
I’m trying to perform math operation (specifically addition) with the values of integer fields on my django models but i kept getting this warning even before running the program:
"Class ‘IntegerField’ does not define ‘add‘, so the ‘+’ operator cannot be used on its instances"
this is my django model code:
class Applicants(models.Model):
fname = models.CharField(max_length=255)
lname = models.CharField(max_length=255)
number = models.CharField(max_length=255)
email = models.CharField(max_length=255)
gender = models.CharField(max_length=255)
p_course = models.CharField(max_length=255)
o_course = models.CharField(max_length=255)
grade1 = models.IntegerField(max_length=255)
grade2 = models.IntegerField(max_length=255)
grade3 = models.IntegerField(max_length=255)
grade4 = models.IntegerField(max_length=255)
grade5 = models.IntegerField(max_length=255)
grade6 = models.IntegerField(max_length=255)
total_grade = grade1 + grade2 + grade3 + grade4 + grade4 + grade5
class Applicants(models.Model):
fname = models.CharField(max_length=255)
lname = models.CharField(max_length=255)
number = models.CharField(max_length=255)
email = models.CharField(max_length=255)
gender = models.CharField(max_length=255)
p_course = models.CharField(max_length=255)
o_course = models.CharField(max_length=255)
grade1 = models.IntegerField()
grade2 = models.IntegerField()
grade3 = models.IntegerField()
grade4 = models.IntegerField()
grade5 = models.IntegerField()
grade6 = models.IntegerField()
@property
def get_sum_of_grades(self):
total_grade = self.grade1 + self.grade2 + self.grade3 + self.grade4 + self.grade4 + self.grade5
return total_grade
Model.clean()¶
This method should be used to provide custom model validation, and to
modify attributes on your model if desired. For instance, you could
use it to automatically provide a value for a field, or to do
validation that requires access to more than a single field (source)
As described here, you should implement a clean method to your model:
class Applicants(models.Model):
fname = models.CharField(max_length=255)
lname = models.CharField(max_length=255)
number = models.CharField(max_length=255)
email = models.CharField(max_length=255)
gender = models.CharField(max_length=255)
p_course = models.CharField(max_length=255)
o_course = models.CharField(max_length=255)
grade1 = models.IntegerField()
grade2 = models.IntegerField()
grade3 = models.IntegerField() # btw Integerfields don't have `max_lenght`
grade4 = models.IntegerField()
grade5 = models.IntegerField()
grade6 = models.IntegerField()
total_grade = models.IntegerField()
def clean(self):
super().clean()
self.total_grade = sum([self.grade1, self.grade2, self.grade3, self.grade4, self.grade4, self.grade5])
For sure that total_grade
field will be shown in a form if you choose to use a models.ModelForm
but you can go for exclude = ['total_grade']
to hide it. Be careful, the result of the computation does not reach "normal" form validation, as it runs before within the statement super().clean()
It turns out that the input received from HTML comes as string.
I had to convert each grade in the views.py file
from request.POST['grade1']
to int(request.POST['grade1'])
for each of the grades and used the self.grade1… method in models.py