Как можно получить сумму инвестированной суммы и суммы депозита с помощью Django
Я пытаюсь вывести некоторую сумму из моих инвестиций, используя строку кода ниже, но она не работает.
investment.basic_investment_return -= investment.basic_withdraw_amount
Модель
from django.db import models
class Investment(models.Model):
basic_deposit_amount = models.IntegerField(default=0, null=True)
basic_interest = models.IntegerField(default=0, null=True)
basic_investment_return = models.IntegerField(default=0, null=True)
basic_withdraw_amount = models.IntegerField(default=0, null=True, blank=True)
basic_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)
Формы
from django import forms
from .models import Investment
class BasicInvestmentForm(forms.ModelForm):
class Meta:
model = Investment
fields = ['basic_deposit_amount']
class BasicWithdrawalForm(forms.ModelForm):
class Meta:
model = Investment
fields = ['basic_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 BasicInvestmentForm, BasicWithdrawalForm,
from .models import Investment,
def create_investment_view(request):
if request.method == 'POST':
basic_investment_form = BasicInvestmentForm(request.POST)
if basic_investment_form.is_valid():
investment = basic_investment_form.save(commit=False)
investment.basic_investment_return += investment.basic_deposit_amount
print(investment.basic_investment_return)
investment.is_active = True
investment.save()
messages.success(request, 'your basic investment of {} is successfull '.format(investment.basic_deposit_amount))
else:
messages.success(request, 'your investment is not successfull! Try again.')
else:
basic_investment_form = BasicInvestmentForm()
context = {'basic_investment_form': basic_investment_form}
return render(request, 'create-basic-investment.html', context)
def create_withdrawal_view(request):
if request.method == 'POST':
basic_withdraw_form = BasicWithdrawalForm(request.POST)
if basic_withdraw_form.is_valid():
investment = basic_withdraw_form.save(commit=False)
investment.basic_investment_return -= investment.basic_withdraw_amount
print(investment.basic_investment_return)
investment.save()
messages.success(request, 'your withdrawal of {} is successfull '.format(investment.basic_withdraw_amount))
else:
messages.success(request, 'your withdrawal of {} is unsuccessfull '.format(investment.basic_withdraw_amount))
else:
basic_withdraw_form = BasicWithdrawalForm()
context = {'basic_withdraw_form': basic_withdraw_form}
return render(request, 'create-basic-withdrawal.html', context)
Я вижу значение
print(investment.basic_investment_return)
в консоли, но я заметил, что результатом всегда является вычитаемое значение.
Проблема здесь в ваших полях в классе BasicWithdrawalForm
. Вам необходимо включить basic_investment_return
, поскольку атрибут fields используется для указания полей модели, которые ваш класс формы может редактировать. Вам также необходимо сделать это для BasicInvestmentForm
, поскольку вы также обновляете basic_investment_return
с помощью этого класса формы.
Я исправил это, удалив метод сохранения из класса модели и запустив всю логику в моих представлениях.
@login_required
def create_investment_view(request):
if request.method == 'POST':
basic_investment_form = BasicInvestmentForm(request.POST)
if basic_investment_form.is_valid():
investment = basic_investment_form.save()
investment.basic_interest = investment.basic_deposit_amount * 365 * 0.02/2
investment.basic_investment_return = investment.basic_deposit_amount + investment.basic_interest
investment.basic_investment_return += investment.basic_deposit_amount
investment.is_active = True
investment.save()
print(investment.basic_interest)
print(investment.basic_investment_return)
print(investment.basic_deposit_amount)
messages.success(request, 'your basic investment of {} is successfull '.format(investment.basic_deposit_amount))
else:
messages.success(request, 'your investment is not successfull! Try again.')
else:
basic_investment_form = BasicInvestmentForm()
context = {'basic_investment_form': basic_investment_form}
return render(request, 'create-basic-investment.html', context)
@login_required
def create_withdrawal_view(request):
if request.method == 'POST':
basic_withdraw_form = BasicWithdrawalForm(request.POST)
if basic_withdraw_form.is_valid():
investment = basic_withdraw_form.save(commit=False)
investment.basic_investment_return -= investment.basic_withdraw_amount
print(investment.basic_investment_return)
investment.save()
messages.success(request, 'your withdrawal of {} is successfull '.format(investment.basic_withdraw_amount))
else:
messages.success(request, 'your withdrawal of {} is unsuccessfull '.format(investment.basic_withdraw_amount))
else:
basic_withdraw_form = BasicWithdrawalForm()
context = {'basic_withdraw_form': basic_withdraw_form}
return render(request, 'create-basic-withdrawal.html', context)
investment.basic_investment_return всегда будет равен нулю, потому что вы никогда его не устанавливали.
Когда ты звонишь
investment = basic_withdraw_form.save(commit=False)
вы создаете экземпляр инвестиции на основе формы, которая имеет единственное поле, basic_withdraw_amount. basic_investment_return не предоставлен, поэтому он будет по умолчанию равен 0, так что
investment.basic_investment_return -= investment.basic_withdraw_amount
print(investment.basic_investment_return)
#is the same as 0 - basic_withdraw_amount
#BUT ONLY at point of print()
В функции сохранения вы, по сути, перезаписываете значение, которое вы напечатали, установив
self.basic_investment_return = self.basic_deposit_amount + self.basic_interest
В настоящее время значение, которое вы установили в представлении (печатное значение), не записывается, оно существует в экземпляре 'investment' только короткое время, пока функция сохранения не отменит его