有两个原因可以解释为什么Transaction模型应该有一个sender和receiver,并使用不同的相关名称将它们分配给CustomUser模型。它可以帮助回答以下问题:
谁发起了交易?
谁收到了资金?
我们想要序列化这个模型,因为我们公司打算使用React.js作为应用程序的前端。我想知道如何验证序列化,以确保发件人可以从他们的帐户发送资金到另一个。
正如你所看到的,我基于django模板创建了它:
def transfer(request):
if request.method == 'POST':
account_number = request.POST['account_number']
amount = Decimal(request.POST['amount'])
superuser_account = Account.objects.get(user='superuser username') # set this username to the admin username or your preferred account.
sender_account = Account.objects.get(user=request.user)
receiver_account = Account.objects.get(account_number=account_number)
interest_rate = 0.02
deduction = amount * interest_rate
if sender_account.account_balance >= amount:
sender_account.account_balance -= amount
sender_account.save()
receiver_account.account_balance += amount
receiver_account.save()
superuser_account.account_balance += deduction
superuser_account.save()
Transaction.objects.create(
sender=request.user, receiver=receiver_account.user,
amount=amount, account_number=account_number
)
return redirect ('Transfer')
else:
messages.error(request, 'Insufficient Funds')
return redirect ('Transfer')
return render(request, 'transfer.html')
此视图检查发件人帐户余额是否大于或等于指定的转账金额。如果发送者没有足够的资金,它会设置一条错误消息并重定向到转账页面。代码还检查是否有足够的资金,代码将从发送方帐户余额中发送指定的金额,并将相同的金额添加到接收方帐户余额中,然后将这些更改保存到数据库中,但使用django rest框架它只有这样的内容:
@api_view(['POST'])
def create_transaction(request):
if request.method == 'POST':
serializer = TransactionSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
在这种情况下,我们不能允许汇款人将资金从他们的帐户转移到另一个帐户,收款人的帐户余额将不会更新。我们如何验证此场景以区分发送方和接收方,并根据来自Transaction模型的金额更新接收方的帐户余额?
1条答案
按热度按时间ncgqoxb01#
为了实现你描述的功能,你想确保发送者可以从他们的账户向另一个账户发送资金,并且接收者的账户余额会相应地更新,你应该使用Serializer在Django REST框架视图中添加自定义验证。在您的示例中,您正在使用TransactionSerializer来创建事务,并且您可以在此序列化程序中添加自定义验证逻辑。
下面是如何修改TransactionSerializer来处理验证和更新账户余额:
在上面的代码中:
我们覆盖TransactionSerializer中的validate方法,以添加自定义验证逻辑。
我们确保发送者和接收者是不同的,正如你提到的。
我们检查汇款人是否有足够的资金。如果不是,我们会抛出一个验证错误。
如果发送者有足够的资金,我们会相应地更新发送者和接收者的帐户余额,并将其保存到数据库中。
有了这个自定义验证,当你通过Django REST框架视图创建一个Transaction对象时,序列化器将确保发送方可以将资金发送到另一个账户,接收方的账户余额将根据交易中指定的金额进行更新。如果任何验证检查失败,则序列化程序将引发验证错误,该错误将在响应中返回。
确保更新视图以使用此序列化程序,并且REST API中应该具有所需的功能。