【问题标题】:django extend installed app model save methoddjango 扩展安装的应用模型保存方法
【发布时间】:2016-07-02 16:09:07
【问题描述】:

假设我需要在保存模型后调用我自己的函数def do_stuff()。如果该模型在我创建的应用程序中,那将没问题。我可以这样做:

def save(self, *args, **kwargs):
        super(Post, self).save(*args, **kwargs)
        do_stuff()

但保存模型时,我需要在第 3 方应用程序中调用 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'

【问题讨论】:

  • 你的项目(你的settings.py所在的目录)是命名为djangocms_blog还是subscription
  • 两者都没有,settings.py 在不同的文件夹中。

标签: python django


【解决方案1】:

在某些特定事件之后会发送一些信号。其中之一,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 被导入到某个地方。建议在app的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'

现在,每次您选择的信号调度时,您的处理函数都会运行。

【讨论】:

  • myprocject/myapp 中我创建了signals.pyapps.py 文件,修改了__init__.py,但这些都没有被编译。
  • 很难猜。您能否将这些文件的内容添加到您的问题中?
  • 在我的应用程序models.py 在文件末尾添加了import subscription.signals,现在它可以工作了。还删除了apps.py 并清除了__init__.py 文件。
  • 注意django版本。就我而言,我有 1.6.10,根据stackoverflow.com/a/21612050/5607745 的答案,我需要在models.py 中导入信号。
【解决方案2】:

您可以使用post_save 信号。模型保存后调用。

【讨论】:

    猜你喜欢
    • 2017-10-20
    • 2016-08-16
    • 2018-11-29
    • 2014-09-25
    • 1970-01-01
    • 2014-06-08
    • 2019-03-04
    • 1970-01-01
    • 2012-11-26
    相关资源
    最近更新 更多