我正在尝试添加所有total
值在Transaction
模型并将它们放入Sale
模型的第一个实例(pk=1
) gross_total
场地。这是我的代码。
模型.py
class Sale(models.Model):
gross_total = models.FloatField()
def __unicode__(self):
return str(self.gross_total)
class Transaction(models.Model):
sale = models.ForeignKey('Sale')
price = models.FloatField()
quantity = models.IntegerField()
total = models.FloatField(blank=True, null=True)
def save(self):
self.total = self.price * self.quantity
return super(Transaction, self).save()
def __unicode__(self):
return str(self.total)
信号.py
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.db.models import Sum
from .models import Transaction, Sale
@receiver(post_save, sender=Transaction)
def update_sale(sender, **kwargs):
sale = Sale.objects.get(pk=1)
sale.gross_total = Transaction.objects.all().aggregate(Sum('total'))['total__sum']
sale.save()
我是使用 Django 信号的新手。我做错了什么?如果我保存一个实例Transaction
建模Sale
模型数据未更新!
发生的事情是……
当你编写代码时signals.py
它是有效的代码,但它永远不会运行,直到直接执行该模块(尽管在本例中不是预期用途)或导入。因此,必须将其导入某处,以便运行代码并将处理函数注册到相应的信号。
当您的 Django 项目运行时,Django 从您的应用程序中声明的应用程序创建应用程序注册表settings.py
。创建注册表时,它会导入在中声明的每个包和模块settings.py
并在此过程中调用几个预定义的函数,包括ready()
里面每一个AppConfig
.
在Python中导入包时,特殊文件中的代码__init__.py
由Python内部自动执行,通常它允许为包定义特殊的行为和属性。
基本上,这会导致:
Django 项目启动。
姜戈读settings.py
并找到您的应用程序作为已声明的应用程序之一。
Django导入你的App包,里面的代码__init__.py
运行并且default_app_config
已指定。现在Dgango知道了。
当所有应用程序的处理完成后,Django 调用ready()
为每个函数AppConfig
在之前的步骤中发现。
ready()
in MyAppConfig
正在运行并且你的signals.py
模块被导入。
在导入过程中,里面的代码signals.py
被执行:你的update_sale
函数被创建并且@receiver
装饰器以它作为参数执行。
The receiver
执行时的装饰器代码寄存器update_sale
要运行的函数post_save
发出的信号Transaction
模型类。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)