在保存子模型时,在 Django 抽象父模型上启动 post 保存
Initiate post save on Django abstract parent model, when child model saved
我有这个型号:
from django.db.models import Model
class SearchModel(Model):
class Meta:
abstract = True
class Book(SearchModel):
book_id = django_models.BigIntegerField(null=True, blank=True)
class Meta:
db_table = 'book'
我需要在 book.save()
上调用 SearchModel 函数(在 Book/not 上没有任何代码更改,在 Book[=22= 上创建 post 保存信号])
我的动机是每个模型继承自 SearchModel,都会有一些 post_save 处理程序(无需编写额外代码 - 仅继承 Signal)
可以吗?
这很简单:在连接您的 post_save
处理程序时不要提供任何特定的 "sender",然后在处理程序中检查 sender
是否是 SearchModel
的子类,即:
from django.db.signals import post_save
from django.dispatch import receiver
from django.db.models import Model
class SearchModel(Model):
class Meta:
abstract = True
def on_post_save(self):
print "%s.on_post_save()" % self
# NB `SearchModel` already inherits from `Model`
class Book(SearchModel):
book_id = django_models.BigIntegerField(null=True, blank=True)
class Meta:
db_table = 'book'
@receiver(post_save)
def search_on_post_save(sender, instance, **kwargs):
if issubclass(sender, SearchModel):
instance.on_post_save()
然后您可以在 SearchModel
中提供默认实现,并在需要时在子类中覆盖它。
在你的signals.py
from django.db.signals import post_save
def search_on_post_save(sender, instance, **kwargs):
pass
for subclass in SearchModel.__subclasses__():
post_save.connect(search_on_post_save, subclass)
我有这个型号:
from django.db.models import Model
class SearchModel(Model):
class Meta:
abstract = True
class Book(SearchModel):
book_id = django_models.BigIntegerField(null=True, blank=True)
class Meta:
db_table = 'book'
我需要在 book.save()
上调用 SearchModel 函数(在 Book/not 上没有任何代码更改,在 Book[=22= 上创建 post 保存信号])
我的动机是每个模型继承自 SearchModel,都会有一些 post_save 处理程序(无需编写额外代码 - 仅继承 Signal)
可以吗?
这很简单:在连接您的 post_save
处理程序时不要提供任何特定的 "sender",然后在处理程序中检查 sender
是否是 SearchModel
的子类,即:
from django.db.signals import post_save
from django.dispatch import receiver
from django.db.models import Model
class SearchModel(Model):
class Meta:
abstract = True
def on_post_save(self):
print "%s.on_post_save()" % self
# NB `SearchModel` already inherits from `Model`
class Book(SearchModel):
book_id = django_models.BigIntegerField(null=True, blank=True)
class Meta:
db_table = 'book'
@receiver(post_save)
def search_on_post_save(sender, instance, **kwargs):
if issubclass(sender, SearchModel):
instance.on_post_save()
然后您可以在 SearchModel
中提供默认实现,并在需要时在子类中覆盖它。
在你的signals.py
from django.db.signals import post_save
def search_on_post_save(sender, instance, **kwargs):
pass
for subclass in SearchModel.__subclasses__():
post_save.connect(search_on_post_save, subclass)