2015-07-10 97 views
0

我正在开发一个简单的预算应用程序。我希望我的帐户余额在我添加新交易时受到影响。在创建时更新Django模型

views.py:

class TransactionList(ListView): 
    template_name = 'envelope/transaction_list.html' 
    model = Transaction 

    def get_context_data(self, **kwargs): 
     context = super(TransactionList, self).get_context_data(**kwargs) 
     context['account_list'] = Account.objects.all() 
     return context 

class TransactionCreate(CreateView): 
    template_name = 'envelope/transaction_create.html' 
    model = Transaction 
    fields = '__all__' 
    success_url = reverse_lazy('transaction_list') 

models.py

class Transaction(models.Model): 
    date = models.DateField(default=datetime.today) 
    amt = models.DecimalField(decimal_places=2, max_digits=8) 
    envelope = models.ForeignKey('Envelope') 
    desc = models.CharField(max_length=50) 

    def __unicode__(self): 
     return u'%s - %s - %s' % (self.date, self.amt, self.desc) 

class Account(models.Model): 
    name_first = models.CharField(max_length=50) 
    name_last = models.CharField(max_length=50) 
    amt = models.DecimalField(decimal_places=2, max_digits=8) 

如何改变Account.amt场时创建一个事务?

+1

什么是'交易'模型中的'envelope'?如何从交易中知道账户? –

+0

@RahulGupta信封是另一种模式,但与这个问题无关,所以我没有包含它。 – denvaar

+0

如何从交易中获取帐户?虽然,我添加了没有这些信息的ans。 –

回答

1
from django.db.models.signals import post_save 
from django.dispatch import receiver 

@receiver(post_save, sender=Transaction) 
def change_account_amt(sender, instance, created, **kwargs): 
    if created: 
     # instance is a Transaction created object ... 
     acc_obj = Account.objects.get(...) 
     acc_obj.amt = ... 
     acc_obj.save() 
0

您可以通过post_save信号很容易地做到这一点。它在save()方法结束时发送。

from django.db.models.signals import post_save 


class Transaction(models.Model): 
    .... 

class Account(models.Model): 
    ... 

# method for updating account amount 
def update_account_amount(sender, **kwargs): 
    instance = kwargs['instance'] 
    created = kwargs['created'] 
    raw = kwargs['raw'] 
    if created and not raw: 
     account = Account.objects.get(...) # get the account object 
     account.amt -= instance.amt # update the amount 
     account.save() # save the account object 

# register the signal 
post_save.connect(update_account_amount, sender=Transaction)