如何在django rest框架中序列化Transaction模型

nhaq1z21  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(118)

有两个原因可以解释为什么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模型的金额更新接收方的帐户余额?

ncgqoxb0

ncgqoxb01#

为了实现你描述的功能,你想确保发送者可以从他们的账户向另一个账户发送资金,并且接收者的账户余额会相应地更新,你应该使用Serializer在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中应该具有所需的功能。

相关问题