Как можно получить сумму инвестированной суммы и суммы депозита с помощью 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' только короткое время, пока функция сохранения не отменит его

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