Ich schreibe eine Art von API für Websites, die nicht direkt auf Banken Payment Gateways zugreifen können ... im Grunde Benutzer würde ein Gateway auf meiner Website erstellen und verwendet dass Gateway Banken zu verbinden und machen GeschäfteAktualisieren eines Feldes in Tabelle A nur durch Einfügen von Vorgang in Tabelle B
hier ist mein Gateway-Modell
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)
hier ist mein Transaktionsmodell
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)
so sieht es ein bisschen wie diese
Transaktion
| id | user_id | gate_id | amount
---------------------------------------------
| 1 | 23 | 110 | 5000
Gateway
| id | user_id | key | money
---------------------------------------------
| 110 | 23 | abcd | 10000
im Grunde möchte ich money
Feld Gateway nur bei jeder Transaktion amount
ich habe aktualisiert werden 2 Option
1 - es tut per Code, nachdem die Transaktion abgeschlossen ist (Bitten ignorieren Syntaxfehler)
gate = Gateway.objects.get(id = transaction.gate_id)
gate.money = gate.money + transaction.amount
gate.save()
2 - verwenden Trigger in der Datenbank
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 ;
i bin sehr neu/Python django so ist es besser fragen und sicher sein als traurig
gibt es eine bessere oder sicherere Option, vielleicht eine Art eingebaute Lösung in Django oder ORM?
Wenn Modelle erstellen/Tabellen bitte versuchen Sie es Namen aviod, die beinhalten das Wort Transaktion verwenden können. es kann verwirrend sein! Sie haben eine Antwort, dass django post_save Signale den Trick machen können. Natürlich kann es, aber Trigger geschehen auf einer niedrigeren Ebene und ausschließlich im Backend, so dass es vielleicht besser für Ihre Aufgabe geeignet ist. – e4c5
@ e4c5 Ja, ich weiß, ich wollte über Datenbanktransaktionen/Rollbacks sprechen, aber ich dachte, es wäre wirklich verwirrend ... Danke, dass ich mich auch auf Trigger lehne – max