仅通过表B

时间:2016-05-31 10:38:00

标签: python mysql django transactions

我为那些无法直接访问银行支付网关的网站写了某种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中有某种内置解决方案?

1 个答案:

答案 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)