gpt4 book ai didi

django - 如何根据使用信号更新另一个模型的字段来更新模型字段?

转载 作者:行者123 更新时间:2023-12-01 11:28:51 25 4
gpt4 key购买 nike

我正在尝试添加所有 total Transaction 中的值模型并将它们放入Sale模型的第一个实例 ( pk=1 ) gross_total field 。这是我的代码。

模型.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 项目启动。
  • Django 读取 settings.py并找到您的应用程序作为声明的应用程序之一。
  • Django导入你的App包,里面的代码__init__.py运行和default_app_config被指定。现在Dgango知道了。
  • 当所有应用程序的处理完成后,Django 调用 ready()每个 AppConfig 的函数在前面的步骤中发现。
  • ready()MyAppConfig正在运行,您的 signals.py模块被导入。
  • 在此导入期间,signals.py 中的代码被执行:你的update_sale函数已创建,@receiver装饰器以它作为参数执行。
  • receiver正在执行的装饰器代码寄存器 update_sale要在 post_save 上运行的函数Transaction 发出的信号模型类。
  • 关于django - 如何根据使用信号更新另一个模型的字段来更新模型字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35110883/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com