django扩展安装的app模型保存方法

时间:2016-07-02 16:09:07

标签: python django

假设我需要在保存模型后调用自己的函数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'

2 个答案:

答案 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信号。保存模型后将调用它。