我可以在 class 中使用 Signal 接收器吗
Can I use Signal receiver within a class
我有这样的信号:
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 中定义如下:
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 class 的应用程序中,在 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() missing 1 required positional argument: '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() got multiple values for argument 'self'
是否有可能从以 self 作为第一个参数的方法接收信号?
谢谢:)
将其标记为静态方法或类方法,以便能够在不需要 self 参数的情况下调用它。
@receiver(virtual_daily_created)
@staticmethod
def get_gga_data(min_date: datetime, max_date: datetime, train_id: str, **kwargs):
do_thing
我有这样的信号:
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 中定义如下:
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 class 的应用程序中,在 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() missing 1 required positional argument: '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() got multiple values for argument 'self'
是否有可能从以 self 作为第一个参数的方法接收信号?
谢谢:)
将其标记为静态方法或类方法,以便能够在不需要 self 参数的情况下调用它。
@receiver(virtual_daily_created)
@staticmethod
def get_gga_data(min_date: datetime, max_date: datetime, train_id: str, **kwargs):
do_thing