只通过表B中的插入操作更新表A中的字段
问题描述:
我正在为无法直接访问银行支付网关的网站编写某种API ...基本上用户会在我的网站上创建网关并使用该网关连接到银行进行交易只通过表B中的插入操作更新表A中的字段
这里是我的网关模型
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?
答
我想你可以使用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)
在创建模型/表请尽量aviod涉及字事务名。它可能会令人困惑!你有一个django post_save信号可以做到这一点。当然它可以,但触发器发生在较低的级别,并且仅在后端发生,因此它可能更适合您的任务。 – e4c5
@ e4c5是的我知道我想谈论数据库交易/回滚,但我认为这将是非常困惑......谢谢我倾向于触发器以及 – max