Как я могу реализовать снятие суммы с инвестиционного баланса с помощью 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)
Если следовать логике вашей программы - в случае вывода сначала мы попадаем в ваш просмотр
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()