Как сохранить данные формы в две отдельные таблицы базы данных в 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')
account_number
должны быть уникальными:unique=True
- Необходимо контролировать соответствие транзакций и текущей суммы. Если операция изменения суммы была неудачной, незавершенная транзакция должна быть удалена .
- Обычно сумма не может быть изменена без транзакции. Вам необходимо реализовать метод, который будет создавать транзакцию каждый раз при автоматическом изменении суммы. Это позволит пропустить проверку транзакции каждый раз при изменении баланса для разработчиков, которые будут продолжать разработку после вас. .
Account.objects.filter(account_number=account_number)
вернет список счетов, но вам нужен только один счет, аaccount_number
должен быть уникальным (см. ①), поэтому лучше использоватьget
вместоfilter
. Это вернет только один объект или вызовет ошибкуNotFound
- Вы должны использовать
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}
)