当前位置: 首页 > 面试题库 >

Django post_save()信号实现

常海
2023-03-14
问题内容

我有一个关于django的问题。

我这里有许多对多模型

class Product(models.Model):
     name = models.CharField(max_length=255)
     price = models.DecimalField(default=0.0, max_digits=9, decimal_places=2)
     stock = models.IntegerField(default=0)

     def  __unicode__(self):
         return self.name

class Cart(models.Model):
    customer = models.ForeignKey(Customer)
    products = models.ManyToManyField(Product, through='TransactionDetail')
    t_date = models.DateField(default=datetime.now())
    t_sum = models.FloatField(default=0.0)

    def __unicode__(self):
         return str(self.id)

class TransactionDetail(models.Model):
    product = models.ForeignKey(Product)
    cart = models.ForeignKey(Cart)
    amount = models.IntegerField(default=0)

对于创建的1个购物车对象,我可以插入尽可能多的新TransactionDetail对象(产品和金额)。我的问题是。如何实现触发器?我想要的是每当创建交易明细时,我希望产品的存货数量减去交易明细中的数量。

我已经阅读了有关post_save()的信息,但不确定如何实现。也许像这样

什么时候:

post_save(TransactionDetail, 
       Cart) #Cart object where TransactionDetail.cart= Cart.id
Cart.stock -= TransactionDetail.amount

问题答案:

如果你真的想使用信号来实现这一目标,这里简单介绍一下,

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

class TransactionDetail(models.Model):
    product = models.ForeignKey(Product)

# method for updating
@receiver(post_save, sender=TransactionDetail, dispatch_uid="update_stock_count")
def update_stock(sender, instance, **kwargs):
    instance.product.stock -= instance.amount
    instance.product.save()


 类似资料:
  • 本文向大家介绍Java 信号量Semaphore的实现,包括了Java 信号量Semaphore的实现的使用技巧和注意事项,需要的朋友参考一下 近日于LeetCode看题遇1114 按序打印,获悉一解法使用了Semaphore,顺势研究,记心得于此。 此解视Semaphore为锁,以保证同一时刻单线程的顺序执行。在此原题上,我作出如下更改。 10个线程的常量池中,分别调用R1,R2,R3的方法多次

  • 我没有使用足够奇怪的信号灯 无论如何,我在查看一些使用它的代码时发现,与锁不同,许可证可以由另一个线程发布(即没有所有权) 我研究了并发操作,它说(第98页): 实现没有实际的许可对象。。。。因此,一个线程获得的许可证可以由另一个线程发布 我之前没有注意到这个细节,并查看了一本操作系统教科书,上面写着(我的重点): 当一个进程修改信号量值时,没有其他进程。。。。等 那么这是Java具体的设计决定吗

  • 信号是指示事件发生的进程的通知。 信号也被称为软件中断,不可预测知道它的发生,因此它也被称为异步事件。 信号可以用数字或名称来指定,通常信号名称以SIG开头。 可用的信号可以用命令(l列出信号名称)来检查,如下所示 - 无论何时发出信号(以编程方式或系统产生的信号),都会执行默认操作。 如果您不想执行默认操作但希望在接收信号时执行自己的操作。 可以处理信号,但不能处理所有的信号。 如果你想忽略信号

  • Django包含一个“信号的分发器”,允许解耦的应用在信号出现在框架的任何地方时,都能获得通知。简单来说,信号允许指定的 发送器通知一系列的接收器,一些操作已经发生了。当一些代码会相同事件感兴趣时,会十分有帮助。 Django 提供了一系列的内建信号,允许用户的代码获得DJango的特定操作的通知。这包含一些有用的通知: django.db.models.signals.pre_save & dj

  • 信号 我们知道信号是进程间通信的其中一种方法,当然也可以是内核给进程发送的消息,注意信号只是告诉进程发生了什么事件,而不会传递任何数据。 这是进程这个概念设计时就考虑到的了,因为我们希望控制进程,就像一个小孩我们想他按我们的想法做,前提就是他能够接受信号并且理解信号的含义。 信号种类 Linux中定义了很多信号,不同的Unix-like系统也不一样,我们可以通过下面的命令来查当前系统支持的种类。

  • 0.6 新版功能. 从 Flask 0.6 开始, Flask 集成了信号支持。这个支持由 blinker 库提供, 并且当它不可用时会优雅地退回。 什么是信号?信号通过发送发生在核心框架的其它地方或 Flask 扩展的动作 时的通知来帮助你解耦应用。简而言之,信号允许特定的发送端通知订阅者发 生了什么。 Flask 提供了几个信号,其它的扩展可能会提供更多。另外,请注意信号倾向于 通知订阅者,而