2

我正在制作游戏。每次发生某个动作时,它都会发送一个信号。该信号被许多不同的对象使用。例如,玩家模型实例会恢复一点生命值,灯笼会减少他们剩下的油量。我希望这些模型的实例在发出信号时做出反应并修改它们的数据。但是,我不知道如何在接收函数中引用实例本身,因为我不能将“self”放在函数使用的参数列表中。

class Lantern(models.Model):
    oil_left= models.IntegerField(default=4)

    @receiver(mySignal)
    def burn(sender, **kwargs):
        self.oil_left  -= 1 #<- self is not defined obviously
        self.save() #<- self is not defined obviously

为什么将接收器作为实例方法?因为在发送信号时,对信号做出反应的实例列表是未知的。该信号只是一个 ping 通知感兴趣的对象(即使用接收器方法)发生了事件,因此它们可以触发自己的特定行为。

4

2 回答 2

1

为什么要让信号成为实例方法?似乎没有任何理由。您只需要确保当您编写信号函数本身时,它会传递相关实例 - 例如作为instancekwarg - 与内置pre-savepost-save信号完全一样。

编辑后添加到问题但这正是信号应该如何工作的。有一个单一的信号函数,它与任何关联信息一起发送信号,以及监听信号的任意数量的接收器。但是接收器本身并不与特定实例相关联——它们不可能,一个实例仅在您实际实例化它时才存在(!),否则它只是数据库中的一行。

也许您的接收器函数可以查询相关对象本身,并在那里更新它们 - 或者更好的是,执行update查询以就地更改它们。

于 2011-12-18T19:32:20.317 回答
0

信号与您的模型对象类更改无关,它与您每次在与模型关联的表中写入数据库之后/之前要做的一些事情有关

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

@receiver(post_save, sender=YourModel)
def your_action_call(sender, instance, **kwargs):
   pass
   #some logic
于 2018-12-20T00:30:46.580 回答