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
Answered By: Deyan Romanov

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

Answered By: Tarquinius

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

Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.