2016-05-31 50 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) 
相關問題