【问题标题】:Django call method after object save with new instance使用新实例保存对象后的Django调用方法
【发布时间】:2015-08-10 06:06:52
【问题描述】:

我想在这个对象(在这个例子中是Question)被保存之后调用一个方法。 这是我得到的:

class Question(models.Model):
    ...

    def after_save(sender, instance, *args, **kwargs):
        some_method(instance)

post_save.connect(Question.after_save, sender=Question)

它有点工作。但问题是instance 数据是旧数据(与保存前相同)。所以some_method(instance) 得到了旧的instance。 但我需要带有新数据的实例。

【问题讨论】:

  • 您找到解决方案了吗?

标签: django django-models signals


【解决方案1】:

您从 post_save 信号调用的方法应该在模型之外。您可以将方法放在 models.py 或其他文件中,例如 signals.py

class Question(models.Model):
    ...
    def some_method(self):
        return "hello"

def question_saved(sender, instance, *args, **kwargs):
    instance.some_method()

post_save.connect(question_saved, sender=Question)

【讨论】:

  • 你得到什么错误?信号不运行?它没有正确调用模型方法吗?你看过stackoverflow.com/questions/13014411/…之类的帖子
  • 请注意,您必须在文件顶部添加“from django.db.models.signals import post_save”才能使其正常工作
【解决方案2】:

您可以覆盖保存方法,并在对象保存后调用您想要的任何内容

这是一个相关链接:Django. Override save for model

【讨论】:

    【解决方案3】:

    你想要的是一种叫做信号的东西:https://docs.djangoproject.com/en/3.2/topics/signals/。 某些操作在成功完成之前和之后都会发送信号。在文档中,您可以找到内置信号的列表。您还可以创建自定义信号。例如,假设每次创建新用户时我都想做一些特定的事情。那么我的代码会是这样的:

    users/models.py
    
    from django.contrib.auth.models import AbstractUser
    from django.dispatch import receiver
    from django.db.models.signals import post_save
    
    class CustomUser(AbstractUser):
        pass
    
    ###############
    # Recieve the signals and get the signals that are sent
    # after models are saved and whose sender is CustomUser
    ###############
    @receiver(post_save, sender='CustomUser')
    def do_something():
        do_something_specific
    

    您也可以将信号保存在名为 signals.py 的单独文件中,但您需要更改应用的应用:

    <appname>/apps.py
    
    from django.apps import AppConfig
    
    class AppnameConfig(AppConfig):
        name = <appname>
    
        def ready(self):
            import <appname>.signals
    

    【讨论】:

      猜你喜欢
      • 2017-12-30
      • 2011-01-06
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      • 2010-12-12
      • 2012-02-19
      • 1970-01-01
      相关资源
      最近更新 更多