python - 我如何允许 django 管理员用户进行汇款,这将扣除发件人帐户并记入收款人帐户?
问题描述
我有两张桌子——一张用于银行账户,另一张用于交易。当用户进行交易时(从他/她自己的账户转账到另一个账户):首先我将发送者的帐号,接收者的帐号,发送的金额和交易日期保存到交易表中,其次我还可以从帐户表中的发件人帐户余额中扣除金额,然后将金额添加到收件人的帐户余额中。所有这些都由django中的单个视图处理。
处理传输的两个表和视图如下:
class Account(models.Model):
ACCOUNT_TYPES = (
('SA' , 'Savings Account' ),
('CA' , 'Current Account' ),
('JA' , 'Joint Account' ),
)
owner = models.ForeignKey(User, on_delete=models.CASCADE,
related_name='accounts', verbose_name='The related user')
account_type = models.CharField(max_length=2, choices=ACCOUNT_TYPES)
account_number = models.CharField(max_length=13, unique=True)
account_balance = models.DecimalField(max_digits=18, decimal_places=2)
last_deposit = models.DecimalField(max_digits=10, decimal_places=2)
interest_rate = models.DecimalField(max_digits=3, decimal_places=0)
date_created = models.DateField(auto_now_add=True)
def __str__(self):
return self.account_number
class Transaction(models.Model):
owner = models.ForeignKey(User, on_delete=models.CASCADE, blank=True,
null=True)
from_account = models.CharField(max_length=13)
to_account = models.CharField(max_length=13)
amount = models.DecimalField(max_digits=10, decimal_places=2)
date_created = models.DateField(auto_now_add=True)
def __str__(self):
return str(self.amount)
@login_required(login_url='../../accounts/login/')
def send(request):
if request.method == 'POST':
form = forms.TransactionForm(request.POST)
if form.is_valid():
sender = Account.objects.get(account_number=request.POST.get('from_account'))
if sender.account_balance > decimal.Decimal(request.POST.get('amount')):
trans = form.save()
trans.owner = request.user
trans.save()
# debit the sender account
sender.account_balance -= decimal.Decimal(request.POST.get('amount'))
sender.save()
#credit the receiver account
receiver = Account.objects.get(account_number=request.POST.get('to_account'))
receiver.account_balance += decimal.Decimal(request.POST.get('amount'))
receiver.save()
return HttpResponseRedirect(reverse_lazy('customers:history'))
# else:
# return
else:
form = forms.TransactionForm()
return render(request, "customers/send_money.html", {'form': form})
但是我的问题是当管理员代表用户转账时如何做同样的事情。如何从账户表中的发件人账户余额中扣除金额,然后将金额添加到收款人的账户余额中。
如果有人可以帮助我,我将不胜感激。
解决方案
一个“肮脏的黑客”解决方法,但不是很好,因为您在更改它时不知道用户是存款还是取款,它位于您应用程序的 admin.py 文件中。例子:
from django.contrib import admin
from .models import Transaction, Account
@admin.register(Account)
class AccountAdmin(admin.ModelAdmin):
list_display = ('owner', 'account_number', 'account_balance')
list_filter = ('account_balance', 'account_type', 'date_created')
list_editable = ['account_balance']
完成上述操作后,account_balance
将可以从管理面板进行编辑。不利的一面是,如果用户有 100 美元,而管理员想要取出 50 美元,但用户只是试图同时花费 60 美元。
或者更糟糕的是:如果你加载管理面板并且用户有 100,当你的页面没有刷新时,他们存入 5000。然后你决定从你看到的值中拿走 50,因为你没有刷新它......现在他们损失了 4950。
有一些方法可以让您自己的管理面板功能可以实时更新。看看如何在那里做到这一点。
推荐阅读
- elasticsearch - 如何编写包含多个字段的 query_string 的复合 Elasticsearch 查询?
- c++ - 使用 find 函数,如何在 C++ 上使用 multimap 找到键的最后一次出现(不是第一次出现)?
- flutter - GET 请求在 Dart 中为 http 包 Flutter 显示“406 - Not Acceptable”
- python - 具有给定数据集条件的 PySpark RDD 编程代码
- python - Python sqlite 查询在终端中工作,但不能作为 exe
- python - UDP:带有simulink客户端OSError的python服务器:[Errno 48]地址已在python中使用
- android - 将包含 id 的字符串转换为 id 类型 Int
- google-apps-script - Google日历使用应用程序脚本在不影响其他事件的情况下连续更改其中一个事件的事件日期
- delphi - 通过 64 位 Delphi 发送 MIDI 控制消息
- c# - 将多个 JSON 属性名称映射到 System.Text.Json 中的同一属性