【问题标题】:Send Custom Parameters to Django Signals向 Django 信号发送自定义参数
【发布时间】:2016-01-09 16:48:48
【问题描述】:

我正在开发 Django Signals,以便在 Postgres 数据库发生任何变化时处理 Redis 中的数据。但是,我无法将自定义参数发送到 Signal Receiver。我遇到了很多问题,但我无法理解如何向 Signal Receiver 发送额外的自定义参数。

通常我会,

@receiver(post_save, sender=post_data)
def addToRedis(sender, instance, **kwargs):

但我想做,

@receiver(post_save, sender=post_data)
def addToRedis(sender, instance, extra_param=extra_param_data **kwargs):
  # Get `extra_param`

这里,我想读取 extra_param 以将数据存储在 Redis 中。

我正在使用 Django Rest 框架。而post_save是在serializer.save()之后直接调用的

如果有人能在这方面帮助我,那就太好了。

【问题讨论】:

标签: python django django-models django-signals


【解决方案1】:

您可以将信号中的任何附加参数作为关键字参数发送:

@receiver(post_save, sender=post_data)
def addToRedis(sender, instance, **kwargs):
    # kwargs['extra_param']

如何发送:

my_signal.send(sender=self.__class__, extra_param='...')

如果您无法访问信号发送功能(例如 REST 框架内部),您始终可以使用custom signal

【讨论】:

  • 我在 extra_param 中遇到 KeyError。我正在使用 Django Rest Framework 并且我猜 serializer.save() 在 post_save 之后直接调用接收器。因此,未传递密钥会导致错误。有什么解决办法吗?
  • 如果信号发送没有提供附加参数,接收方没有得到它是合理的......您应该在您的问题中提供更多信息。不知道其余框架如何处理事件。无论如何,您始终可以实现您的自定义信号。
  • 不值得,需要显式调用,信号的目的是自动调用。
【解决方案2】:

这个关于 Django Rest 的回答:

在你的views.py中

my_obj = Mymodel()
my_obj.your_extra_param = "Param Value" # your_extra_param field (not Defined in Model)
my_obj.save()
post_save.connect(rcver_func,sender=Mymodel,weak=False)

并定义一个signal.py

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

@receiver(post_save,sender=Mymodel)
def rcver_func(sender, instance, created,**kwargs):
    if created:
        received_param_value = instance.your_extra_param # same field as declared in views.py

【讨论】:

    猜你喜欢
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2014-07-10
    • 1970-01-01
    • 2023-03-28
    • 2021-11-26
    相关资源
    最近更新 更多