Как сохранить данные формы в две отдельные таблицы базы данных в Django

Как мне сохранить данные из формы в Django в две отдельные таблицы базы данных. Данные будут сохранены в одной таблице, а также использованы для обновления баланса в другой таблице. В первой таблице есть столбец "сумма", и данные сохраняются в этот столбец. В другой таблице будет столбец под названием balance, и данные из формы будут добавлены к балансу в этом столбце.

Вы можете легко сделать это следующим образом:

в models.py

from django import models

class Amount(models.Model):
    amount = models.CharField(max_length=100)

class Balance(models.Model):
    balance = models.CharField(max_length=100)

в файле views.py

from .models import Amount, Balance

def form_view(request):
    if request.method == "POST":
        amount = request.POST.get('amount')
        balance = request.POST.get('balance')
        Amount.objects.create(amount=amount)
        Balance.objects.create(balance=balance)
        return render(request,'home.html', {'message':'amount&balance saved'})
    return render(request,'home.html')

в HTML:

<form method="POST">
    <input id="amount" type="text" name="amount" required>
    <input id="balance" type="text" name="balance" required>
    <input type="submit" value="OK">
</form>

Похоже, что вы уже сохранили сумму в таблице Trans. Теперь вам нужно сначала найти счет, и поскольку я предполагаю, что есть только один счет с номером счета, вы должны использовать get вместо filter. Я использовал get_object_or_404, чтобы, если счет не будет показан, вместо ошибки ObjectDoesNotExistError была выдана ошибка page not found. Когда счет найден, добавьте сумму к текущему балансу этого счета, затем сохраните его.

def deposit(request):
    submitted = False
    if request.method == "POST":
        amount = request.POST.get('amount')
        account_number = request.POST.get('account_number')
        amount=int(amount)
        Trans.objects.create(amount=amount)

        account = get_object_or_404(Account, account_number=account_number)
        account.current_balance = account.current_balance + amount
        account.save()

        return render(request,'accounts/deposit.html', {'message':'amount&balance saved'})

    return render(request,'accounts/deposit.html')
  1. account_number должны быть уникальными: unique=True
  2. Необходимо контролировать соответствие транзакций и текущей суммы. Если операция изменения суммы была неудачной, незавершенная транзакция должна быть удалена
  3. .
  4. Обычно сумма не может быть изменена без транзакции. Вам необходимо реализовать метод, который будет создавать транзакцию каждый раз при автоматическом изменении суммы. Это позволит пропустить проверку транзакции каждый раз при изменении баланса для разработчиков, которые будут продолжать разработку после вас.
  5. .
  6. Account.objects.filter(account_number=account_number) вернет список счетов, но вам нужен только один счет, а account_number должен быть уникальным (см. ①), поэтому лучше использовать get вместо filter. Это вернет только один объект или вызовет ошибку NotFound
  7. Вы должны использовать ForeignKey для Trans связанных с Account.id для создания отношений между таблицами.

Моделями являются:

from django.db import transaction, models


class Trans(models.Model):
    name = models.CharField('Name', max_length=120)
    account_number = models.CharField('Account Number', max_length=120)
    amount = models.IntegerField('Amount')

class Account(models.Model):
    ...
    account_number = models.CharField('Account Number', unique=True, max_length=20, null=True)
    ...
    current_balance = models.IntegerField('Balance', default=0, null=True)

    # transaction atomic allows to group changes in DB
    # if save operation will fail transaction creation will be also restored
    @transaction.atomic
    def apply_deposit(self, amount: int):

        # create new deposit transaction
        Trans.objects.create(
            name="I'dont know what means name for transaction",
            amount=amount,
            account_number=self.account_number
        )

        # update balance
        self.current_balance += amount
        self.save()

метод депонирования:

from django.shortcuts import render
from django http import HttpReposne

def deposit(request):
    if request.method == "POST":
        amount = int(request.POST.get('amount'))
        account_number = request.POST.get('account_number')
        
        # get affected account number
        try:
            acc = Account.objects.get(account_number=account_number)
        except Account.DoesNotExist:
            return HttpResponse('Account not found', status=404)

        # proceed deposit transaction
        acc.apply_deposit(amount)

        return render(
            request,
            'accounts/deposit.html',
            {'message':'amount&balance saved', 'current_balance': acc.current_balance}
        )
Вернуться на верх