假设我需要在保存模型后调用自己的函数def do_stuff()
。如果该模型将在我创建的app中,那就没问题了。我能做到:
def save(self, *args, **kwargs):
super(Post, self).save(*args, **kwargs)
do_stuff()
但是我需要在保存模型时在第三方应用中调用save()
。我可以想到只将所有项目复制到我的本地目录并附加save()
方法,但这并不好,因为我必须复制所有应用程序代码。有没有更好的方法呢?
编辑:
apps.py:
from django.apps import AppConfig
class SubscriptionConfig(AppConfig):
def ready(self):
import subscription.signals
signals.py:
from django.db.models.signals import post_save
from django.dispatch import receiver
from djangocms_blog.models import Post
@receiver(post_save, sender=Post)
def send_emails(instance, **kwargs):
print 'instance %s' %instance
__init__.py:
default_app_config = 'subscription.apps.SubscriptionConfig'
答案 0 :(得分:2)
在某些特定事件发生后会发出信号。其中之一,post_save(或pre_save,如果您想在保存对象之前做某事,则可以适用于您的情况。
更具体地说,在应用的文件夹中创建signals.py
:
from django.db.models.signals import post_save
from django.dispatch import receiver
from your_project.your_app.models import YourModel
@receiver(post_save, sender=YourModel)
def do_stuff(instance, **kwargs):
# instance here is your object, you can use or modify it
instance.title = "New title"
# don't forget to save your object if you edit
instance.save()
然后确保在某处导入此signals.py
。建议在应用的apps.py
:
from django.apps import AppConfig
class YourAppConfig(AppConfig):
name = 'your_projects.your_app'
verbose_name = "Your app's verbose name"
def ready(self):
from your_project.your_app import signals
最后一步,确保您的应用使用您在那里定义的AppConfig
。打开应用__init__.py
并输入:
default_app_config = 'your_projects.your_app.apps.YourAppConfig'
现在,每当您选择的信号发送时,您的处理函数都将运行。
答案 1 :(得分:0)
您可以使用post_save信号。保存模型后将调用它。