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?
在創建模型/表請儘量aviod涉及字事務名。它可能會令人困惑!你有一個django post_save信號可以做到這一點。當然它可以,但觸發器發生在較低的級別,並且僅在後端發生,因此它可能更適合您的任務。 – e4c5
@ e4c5是的我知道我想談論數據庫交易/回滾,但我認爲這將是非常困惑......謝謝我傾向於觸發器以及 – max