Как я могу реализовать снятие суммы с инвестиционного баланса с помощью Django?

Вот моя Модель

Я потратил бесчисленное количество часов, безуспешно пытаясь реализовать "снятие средств с инвестиций". print(investment.investment_return) показывает точную сумму, но я не знаю, почему не обновляется Доступный баланс или

total_available_balance

из приборной панели. Изображение приборной панели прилагается.

Здесь я хочу, чтобы деньги были вычтены

total_available_balance = Investment.objects.filter(is_active=False).aggregate(
        total_available_balance=Sum('investment_return'))['total_available_balance']

Я также хочу, чтобы деньги выводились по истечении срока. Я использовал эту строку кода для установки инвестиционного периода. Как я могу сделать так, чтобы пользователь снимал деньги только тогда, когда наступит срок?

self.due_date = datetime.now() + timedelta(seconds=5)

обеспечить

from django.db import models
from django.db.models import Max, Sum, F
from datetime import datetime, timedelta


class Investment(models.Model):
    PLAN_CHOICES = (
        ("Basic - Daily 2% for 180 Days", "Basic - Daily 2% for 180 Days"),
        ("Premium - Daily 4% for 360 Days", "Premium - Daily 4% for 360 Days"),
    )
    plan = models.CharField(max_length=100, choices=PLAN_CHOICES, null=True)
    deposit_amount = models.IntegerField(default=0, null=True)
    basic_interest = models.IntegerField(default=0, null=True)
    premium_interest = models.IntegerField(default=0, null=True)
    investment_return = models.IntegerField(default=0, null=True)
    withdraw_amount = models.IntegerField(default=0, null=True, blank=True)
    balance = models.IntegerField(default=0, null=True, blank=True)
    total_available_balance = models.IntegerField(default=0, null=True, blank=True)
    locked_balance = models.IntegerField(default=0, null=True, blank=True)
    investment_id = models.CharField(max_length=10, null=True, blank=True)
    is_active = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now=True, null=True)
    due_date = models.DateTimeField(null=True)


    def save(self, *args, **kwargs):
        if self.plan == "Basic - Daily 2% for 180 Days":
            self.basic_interest =  self.deposit_amount * 365 * 0.02/2
            self.investment_return = self.deposit_amount + self.basic_interest
            self.due_date = datetime.now() + timedelta(seconds=5)
        else:
            self.premium_interest = self.deposit_amount*365*0.04
            self.investment_return = self.deposit_amount +self.premium_interest
            self.due_date = datetime.now() + timedelta(seconds=5)
        super(Investment, self).save(*args, **kwargs)

Вот мои Модельные формы

from django import forms
from .models import Investment


class DateInput(forms.DateInput):
    input_type = 'date'


class InvestmentForm(forms.ModelForm):
    class Meta:
        model = Investment
        fields = ['deposit_amount', 'plan']


class WithdrawalForm(forms.ModelForm):
    class Meta:
        model = Investment
        fields = ['withdraw_amount']

Вот мои мнения

from django.shortcuts import get_object_or_404, redirect, render
from django.db.models import Sum, F
from django.contrib import messages
from .forms import (
    WithdrawalForm,
    InvestmentForm,
)
from .models import (
    Investment,
)


def create_investment_view(request):
    if request.method == 'POST':
        investment_form = InvestmentForm(request.POST)
        if investment_form.is_valid():
            investment = investment_form.save(commit=False)
            investment.is_active = True
            investment.save()
            messages.success(request, 'your investment of {} is successfull '.format(investment.deposit_amount))
        else:
            messages.success(request, 'your investment is not successfull! Try again.')
    else:
        investment_form = InvestmentForm()
    context = {'investment_form': investment_form}
    return render(request, 'create-investment.html', context)


def create_withdrawal_view(request):
    if request.method == 'POST':
        withdraw_form = WithdrawalForm(request.POST)
        if withdraw_form.is_valid():
            investment = withdraw_form.save(commit=False)
            investment.investment_return -= investment.withdraw_amount
            investment.save()
            messages.success(request, 'your Withdrawal is successfull')
        else:
            messages.success(request, 'Your withdrawal is unsuccesfull. Try again')
    else:

        withdraw_form = WithdrawalForm()
    context = {'withdraw_form': withdraw_form}
    return render(request, 'create-withdrawal.html', context)


def list_investments(request):
    investments = Investment.objects.all()
    total_invested = Investment.objects.aggregate(
        total_invested=Sum('deposit_amount'))
    
    total_withdrawned = Investment.objects.aggregate(
        total_withdrawned=Sum('withdraw_amount'))


    locked_total_balance = Investment.objects.filter(is_active=True).aggregate(
        locked_total_balance=Sum('investment_return'))['locked_total_balance']

    total_available_balance = Investment.objects.filter(is_active=False).aggregate(
        total_available_balance=Sum('investment_return'))['total_available_balance']


    context = {
        'total_invested': total_invested,
        'total_withdrawned': total_withdrawned,
        'locked_total_balance': locked_total_balance,
        'total_available_balance': total_available_balance,
    }
    return render(request, 'list-investments.html', context)

enter image description here

Если следовать логике вашей программы - в случае вывода сначала мы попадаем в ваш просмотр

        investment = withdraw_form.save(commit=False)
        investment.investment_return -= investment.withdraw_amount
        investment.save()

Затем investment.save() переводит нас к вашей переопределенной функции сохранения, которая имеет что-то вроде этого

        self.premium_interest = self.deposit_amount*365*0.04
        self.investment_return = self.deposit_amount +self.premium_interest
        self.due_date = datetime.now() + timedelta(seconds=5)
    super(Investment, self).save(*args, **kwargs)

Таким образом, функция сохранения переопределяет значение investment_return перед тем, как оно будет сохранено вызовом super.

Поскольку метод save() используется во многих контекстах, с которыми вы, возможно, не захотите возиться, вместо того, чтобы передавать аргумент вашему новому методу save в этом случае, я бы рекомендовал вместо этого создать специальный метод special_save() для вашей инвестиционной модели, который делает именно то, что вы хотите, чтобы произошло в этом контексте, а затем вызывает super().save()

Вернуться на верх