我该如何进行Python中的银行应用?

1 投票
3 回答
3046 浏览
提问于 2025-04-16 19:37

我知道一些基础的Python和Django,但还不算很高级。我想做一个个人用的银行应用程序。这个应用会有不同类型的账户,比如储蓄账户和定期存款账户。我需要计算利息,并且能自动把钱放到这些账户里。

有没有这类应用的例子可以让我开始学习?

3 个回答

0

要用Python和Django创建一个银行应用,你需要先建立一个Django模型。在银行系统中,最基本的有两个模型:账户模型和交易模型。

class Account(models.Model):

    ACCOUNT_TYPE = (
        ('Savings', 'savings'),
        ('Current', 'current')
    )
    ACCOUNT_STATUS = (
        ('Active', 'active'),
        ('Closed', 'closed'),
        ('Frozen', 'frozen')
    )

    FIXED_DEPOSIT = (
        ('Regular', 'regular'),
        ('Senior Citizen', 'senior citizen'),
        ('Corporate', 'corporate')

    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    account_number = models.IntegerField(editable=False)
    account_balance = models.DecimalField(max_digits=6, decimal_places=3)
    account_type = models.CharField(max_length=50, choices=ACCOUNT_TYPE)
    account_status = models.CharField(max_length=50, choices=ACCOUNT_STATUS)
    transfer_pin = models.IntegerField()
    fixed_deposit = models.CharField(max_length=50, choices=FIXED_DEPOSIT)

这是账户模型所需的基本字段。你可以添加更多字段,设计自己的银行系统,但这些字段是必须的。

创建账户模型后,当用户被创建时,账户号码和一些字段应该自动生成。在这种情况下,我们需要使用Django信号,这样每当创建一个用户时,就会自动生成一个账户模型对象。使用Django信号的原因是,它可以简单地创建账户模型对象。想象一下这是一个社交媒体应用;每个用户都有一个个人资料。你觉得让用户手动创建个人资料页面真的是个好主意吗?如果是的话,用户可能会创建多个个人资料页面。这就是我们想用Django信号自动为你创建账户模型的原因。

from .models import Account
from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
import random
import string

#we should generate an account number for each user, we can't just create it manually.
def generate_account_number():
    start_number = '55' + ''.join(random.choices(string.digits, k=8
    return start_number

User = settings.AUTH_USER_MODEL
   
@receiver(post_save, sender=User)
def create_account(created, instance, sender, **kwargs):
    if created:
        transfer_pin = instance.transfer_pin
        account_status = 'Active'
        account_type = 'Savings' #you can edit that, but for this time, it should be a savings account.
        fixed_deposit = 'Regular' # you can also edit it, but for this time, it should be created with Regular.
        account_number = generate_account_number()
        #create an Account model automatically
        Account.objects.create(
            user=instance, 
            account_number=account_number, 
            account_type=account_type,
            account_status=account_status,
           fixed_deposit=fixed_deposit, transfer_pin=transfer_pin, account_balance=0
        )

要创建交易模型,你需要定义一些必要的字段,比如:金额、发送者、接收者、账户号码和时间戳。在这个例子中,我创建了发送者和接收者字段,并将它们与一个自定义用户模型关联。 在Django模型中,当你在交易模型中定义发送者和接收者时,实际上是在建模一个金融或交易系统。你可能需要这两个字段的原因如下:

  1. 发送者字段代表发起或发送交易的实体。这可以是个人、企业或任何转移资金或资源的账户。在金融上下文中,它可能是从中扣除或提取资金的账户。

  2. 接收者字段则代表交易的接收方。这是通过交易获得资金或资源的账户或实体。在金融术语中,它是接收资金的账户。

在你的交易模型中有发送者和接收者字段,可以清晰地处理金融交易,确保你能够追踪和验证资产在应用中的流动。这让你能够回答一些问题,比如:

  1. 谁发起了这笔交易?
  2. 谁收到了资金?
class Transaction(models.Model):
    amount = models.DecimalField(max_digits=6, decimal_places=3, editable=False),
    account_number = models.IntegerField()
    sender = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='who_send')
    receiver= models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='who_receive')
    timestamp = models.DateTimeField(auto_now_add=True)

现在是时候创建一个交易视图,并将利率发送到超级用户账户了。

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')

这段代码检查发送者账户的余额是否大于等于指定的转账金额。如果发送者的资金不足,它会设置一个错误信息并重定向到转账页面。如果资金充足,代码会从发送者账户余额中扣除指定金额,并将相同的金额添加到接收者账户余额中。然后,它会将这些更改保存到数据库中。在这段代码中,利率是2%(0.02),并根据交易金额计算扣除的金额。然后,我从发送者账户中扣除交易金额和利息。

0

你需要给这个应用授权,让它可以访问你的银行账户。可以了解一下他们使用的授权框架,比如OAuth。还有一些库可以帮助你和这些标准框架进行连接,比如Authlib。

1

可以先从djangoproject.com上的教程开始学习,然后再继续深入。

如果你想看看已经做好的项目,可以去这个链接:http://code.google.com/p/django-budget/,这个项目会给你一个很好的起点。

撰写回答