Transaction 模型应该有发送者和接收者并将它们分配给具有不同相关名称的 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)
在这种情况下,我们不能允许汇款人将资金从其帐户转移到另一个帐户,并且收款人的帐户余额也不会更新。我们如何验证这个场景,以区分发送者和接收者,并根据交易模型中的金额更新接收者的账户余额?
为了实现您所描述的功能,您希望确保发送方可以将资金从其帐户发送到另一个帐户,并且接收方的帐户余额相应更新,您应该使用以下方法将 自定义验证 添加到您的 Django REST 框架视图序列化器。在您的情况下,您正在使用 TransactionSerializer 创建事务,并且您可以在此序列化器中添加自定义验证逻辑。
以下是如何修改 TransactionSerializer 来处理验证和更新帐户余额:
from rest_framework import serializers
from .models import Transaction, Account
class TransactionSerializer(serializers.ModelSerializer):
class Meta:
model = Transaction
fields = '__all__'
def validate(self, data):
sender = data.get('sender')
receiver = data.get('receiver')
amount = data.get('amount')
# Ensure that the sender and receiver are different
if sender == receiver:
raise serializers.ValidationError("Sender and receiver cannot be the same.")
sender_account = Account.objects.get(user=sender)
receiver_account = Account.objects.get(user=receiver)
# Check if the sender has sufficient funds
if sender_account.account_balance < amount:
raise serializers.ValidationError("Insufficient Funds.")
# Update the account balances
sender_account.account_balance -= amount
receiver_account.account_balance += amount
# Save the updated account balances to the database
sender_account.save()
receiver_account.save()
return data
在上面的代码中:
我们重写 TransactionSerializer 中的 validate 方法来添加自定义验证逻辑。
正如您提到的,我们确保发送者和接收者是不同的。
我们检查发件人是否有足够的资金。如果不是,我们会提出验证错误。
如果发送者有足够的资金,我们会相应更新发送者和接收者的账户余额并将其保存到数据库中。
有了此自定义验证,当您通过 Django REST 框架视图创建 Transaction 对象时,序列化器将确保发送者可以将资金发送到另一个帐户,并且接收者的帐户余额将根据指定的金额进行更新在交易中。如果任何验证检查失败,序列化器将引发验证错误,该错误将在响应中返回。
确保更新您的视图以使用此序列化器,并且您的 REST API 中应该具有所需的功能。