2016-05-31 20 views
0

我正在为无法直接访问银行支付网关的网站编写某种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?

+0

在创建模型/表请尽量aviod涉及字事务名。它可能会令人困惑!你有一个django post_save信号可以做到这一点。当然它可以,但触发器发生在较低的级别,并且仅在后端发生,因此它可能更适合您的任务。 – e4c5

+0

@ e4c5是的我知道我想谈论数据库交易/回滚,但我认为这将是非常困惑......谢谢我倾向于触发器以及 – max

回答

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) 
相关问题