Django 3.2 how to add model decimal fields together inside model

Question:

I am trying to add all the decimalfields numbers together to form a sum inside the model

this is my model

class Ataskaita(models.Model):

    class Meta:
        verbose_name_plural = 'Ataskaitos'

    bendrija = models.ForeignKey(Bendrija, on_delete=models.CASCADE,
                                 related_name="ataskaita")

    atlyginimas = models.DecimalField(max_digits=10, decimal_places=2, null=False, default=0)
    sodra = models.DecimalField(max_digits=10, decimal_places=2, null=False, default=0)
    vmi = models.DecimalField(max_digits=10, decimal_places=2, null=False, default=0)
    pvm_saskaitos_kvitas = models.DecimalField(max_digits=10, decimal_places=2, null=False, default=0)
    bankines_operacijos = models.DecimalField(max_digits=10, decimal_places=2, null=False, default=0)
    
    sum = models.DecimalField(max_digits=10, decimal_places=2)

and I want to add all the fields (atlyginimas, sodra, vmi, pvm_saskaitos_kvitas, bankines_operacijos) together so I have all of their total

I looked around stackoverflow and I think the only way to do it is to create a method, but I already tried it, and it wouldn’t work as intended

Asked By: Sir.Breezy

||

Answers:

Django models are just python classes, so adding arbitrary methods like this should work fine:

class Ataskaita(models.Model):
    class Meta:
        verbose_name_plural = 'Ataskaitos'

    bendrija = models.ForeignKey(Bendrija, on_delete=models.CASCADE,
                                 related_name="ataskaita")

    atlyginimas = models.DecimalField(max_digits=10, decimal_places=2, null=False, default=0)
    sodra = models.DecimalField(max_digits=10, decimal_places=2, null=False, default=0)
    vmi = models.DecimalField(max_digits=10, decimal_places=2, null=False, default=0)
    pvm_saskaitos_kvitas = models.DecimalField(max_digits=10, decimal_places=2, null=False, default=0)
    bankines_operacijos = models.DecimalField(max_digits=10, decimal_places=2, null=False, default=0)

    @property
    def sum(self):
        return sum([self.atlyginimas, self.sodra, self.vmi, self.pvm_saskaitos_kvitas, self.bankines_operacijos])

You can instruct your serializers to display read-only properties with something like this:

class Ataskaita(serializers.ModelSerializer):
    sum = serializers.ReadOnlyField()

    class Meta:
        model = Ataskaita
        fields = '__all__'

Does that do what you wanted?

Answered By: Danielle M.
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.