我为那些无法直接访问银行支付网关的网站写了某种api ...基本上用户会在我的网站上创建一个网关并使用该网关连接到银行并进行交易
这是我的网关模型
class Gateways(models.Model):
user = models.ForeignKey(User , editable=False)
key = models.UUIDField(unique=True , editable=False , default=uuid.uuid1().hex)
date = models.DateTimeField(auto_now_add=True)
domain = models.CharField(max_length=50, default='')
title = models.CharField(max_length=100 , default='')
confirm = models.BooleanField(default=False)
money = models.DecimalField(max_digits=12, decimal_places=4 , editable=False)
这是我的交易模型
class Transactions(models.Model):
user = models.ForeignKey(User , editable=False)
gate = models.ForeignKey(Gateways , editable=False)
amount = models.DecimalField(max_digits=12, decimal_places=4 , editable=False)
date = models.DateTimeField(auto_now_add=True , editable=False)
code = models.CharField(max_length=100 , editable=False)
所以看起来有点像这样
交易
| id | user_id | gate_id | amount
---------------------------------------------
| 1 | 23 | 110 | 5000
网关
| id | user_id | key | money
---------------------------------------------
| 110 | 23 | abcd | 10000
基本上我希望仅使用每个事务money
amount
字段
我有2个选项
1 - 在事务完成后通过代码执行(请求忽略语法错误)
gate = Gateway.objects.get(id = transaction.gate_id )
gate.money = gate.money + transaction.amount
gate.save()
2 - 在数据库中使用触发器
DELIMITER $$
CREATE TRIGGER new_transaction
AFTER INSERT
ON transactions
FOR EACH ROW
BEGIN
UPDATE gateways SET money = money + NEW.amount WHERE id = NEW.gate_id ;
END $$
DELIMITER ;
我是django / python的新手,所以它更好地问及安全而不是抱歉
是否有更好或更安全的选择,也许在django或它的ORM中有某种内置解决方案?
答案 0 :(得分:1)
我认为你可以使用django post_save
请参阅此https://docs.djangoproject.com/en/1.9/ref/signals/#post-save
使用以下代码更新models.py
def update_money(sender, instance, created, **kwargs):
if created:
gate = Gateway.objects.get(id = instance.gate_id )
gate.money = gate.money + transaction.amount
gate.save()
signals.post_save.connect(update_money, sender=Transactions)