【问题标题】:Can I use Signal receiver within a class我可以在课堂上使用信号接收器吗
【发布时间】:2020-07-29 15:26:43
【问题描述】:

我有这样的信号:

virtual_daily_created = django.dispatch.Signal(providing_args=['min_date', 'max_date', 'train_id'])

从这样的视图调用它:

signal = virtual_daily_created.send_robust(self.__class__, min_date=start_ts,
                                           max_date=end_ts,
                                           train_id=train_id)

并且接收者在一个这样定义的类中:

class BigQueryData:
    def __init__(self):
        some_code

    def set_query(self, table: bigquery.TableReference, train_id: str, min_date: datetime, 
max_date: datetime,**kwargs) -> str:
        do_thing

    def set_table(self, type: str) -> bigquery.TableReference:
        do_thing

    @receiver(virtual_daily_created)
    def get_gga_data(self, min_date: datetime, max_date: datetime, train_id: str, **kwargs):
        do_thing

最后在我的包含 BigQueryData 类的应用程序中,在我的 app.py 文件中:

from django.apps import AppConfig
from django.dispatch import receiver


class ShiftsConfig(AppConfig):
  name = 'shifts'

    def ready(self):
        from api.v1.virtual_daily_report import VirtualDailyReportList
        from reports.signals import virtual_daily_created

        virtual_daily_created.connect(receiver, sender=VirtualDailyReportList)

当收到信号时我收到了这个错误:

get_gga_data() 缺少 1 个必需的位置参数:'self'

所以我试着像这样改变我的信号:

virtual_daily_created = django.dispatch.Signal(providing_args=['self', 'min_date', 'max_date', 'train_id'])

然后这样称呼它:

signal = virtual_daily_created.send_robust(self.__class__, self=BigQueryData(), 
                                           min_date=start_ts,
                                           max_date=end_ts,
                                           train_id=train_id)

但是当我收到一个信号时,我得到了这个错误:

send_robust() 获得了参数“self”的多个值

是否甚至可以从以 self 作为第一个参数的方法接收信号?

谢谢你:)

【问题讨论】:

    标签: django self django-signals


    【解决方案1】:

    将其标记为静态方法或类方法,以便能够在不需要 self 参数的情况下调用它。

        @receiver(virtual_daily_created)
        @staticmethod
        def get_gga_data(min_date: datetime, max_date: datetime, train_id: str, **kwargs):
            do_thing
    

    【讨论】:

    • Staticmethod 不是一个选项,但它适用于 classmethod !谢谢你:)
    猜你喜欢
    • 2020-03-21
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多