2
respostas

CALCULOS MATEMATICOS NO DJANGO MODELS

Fala dev!

Estou tentando implementar um modelo matemático na minha aplicação django, no entanto estou com dificuldades.

No meu modelo, eu preciso buscar no banco de dados se a data de pagamento (inserida pelo admin), verificar se esta data é maior que um mês e devolver, se o ultimo pagamento for maior que um mês: inadimplente. E se o pagamento for MENOR que um mês: Adimplente.

Consegui fazer o seguinte modelo:

from datetime import datetime
from dateutil.relativedelta import relativedelta

ultimo_pagamento = datetime(2021,2,1,23) # ESTE INPUT DEVE VIR DO BANCO DE DADOS
data_do_pagamento = datetime.now()

diff = relativedelta(data_do_pagamento, ultimo_pagamento)

# Imprimindo apenas diferenças menores de 1 ano
if diff.months >= 1 and diff.years > 0:
    print(f'Você está devendo {diff.months} meses ou mais de aluguel. Seu status é de INADIMPLENTE!')
else:
    print(f"Você está ADIMPLENTE. Seu último pagamento aconteceu a {diff.days} dias atrás")

Com este modelo inserido, consigo exibir as informações na página.

O problema é: Onde inserir este modelo?

Tentei inserir tanto no models.py quanto no views.py, ambos não realizam a operação.

2 respostas

Tentei adicionar no views.py da seguinte maneira:

def calcula_inadimplencia(request, ultimo_pagamento, inquilino_id):
        if request.method == 'POST':
            inquilino_id = request.POST['inquilino_id']
            i = Inquilino.objects.get(pk=inquilino_id)
            i.ultimo_pagamento = request.POST['ultimo_pagamento']
            ultimo_pagamento = i.ultimo_pagamento
            data_do_pagamento = datetime.now()


            diff = relativedelta(data_do_pagamento, ultimo_pagamento)

            if diff.months >= 1 and diff.years > 0:
                print(f'Você está devendo {diff.months} meses ou mais de aluguel. Seu status é de INADIMPLENTE!')
            else:
                print(f"Você está ADIMPLENTE. Seu último pagamento aconteceu a {diff.days} dias atrás")

            diff.save()

Olá Rafael, como você está?

Peço desculpas pela demora em obter um retorno.

Neste caso, essas operações estarão tanto em models quanto em views, como mostro abaixo, por exemplo:

models.py

from datetime import datetime
from dateutil.relativedelta import relativedelta
from django.db import models

class Inquilino(models.Model):
    nome = models.CharField(max_length=200)
    ultimo_pagamento = models.DateField(blank=True, null=True)

    def esta_adimplente(self):
        if self.ultimo_pagamento:
            data_do_pagamento = datetime.now().date()
            diff = relativedelta(data_do_pagamento, self.ultimo_pagamento)

            if diff.months >= 1 and diff.years > 0:
                return False
        return True

views.py

from django.shortcuts import render, get_object_or_404
from .models import Inquilino

def detalhes_inquilino(request, inquilino_id):
    inquilino = get_object_or_404(Inquilino, pk=inquilino_id)
    status = "INADIMPLENTE" if not inquilino.esta_adimplente() else "ADIMPLENTE"
    return render(request, 'detalhes_inquilino.html', {'inquilino': inquilino, 'status': status})

A solução proposta acima, utiliza o método esta_adimplente definido na classe Inquilino para realizar a verificação do status do inquilino com base na data do seu último pagamento, e depois utiliza este status na view para exibir a mensagem correspondente na página.

Espero ter ajudado.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!