2016-05-31 6 views
0

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?

+0

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

+0

@ 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

Antwort

1

ich glaube, Sie django post_save sehen dieses https://docs.djangoproject.com/en/1.9/ref/signals/#post-save

Aktualisieren Sie Ihre models.py mit den folgenden Codes

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)