当前位置: 首页 > 面试题库 >

Django post_save防止递归而不覆盖模型save()

翟源
2023-03-14
问题内容

有很多关于使用post_save信号进行递归的Stack Overflow帖子,其中的注释和答案绝大多数是“为什么不重写save()”或仅在其上触发的保存created == True

好吧,我相信有一个不使用的好例子save()-例如,我正在添加一个临时应用程序,该应用程序处理与订单模型完全不同的订单履行数据。

框架的其余部分非常高兴地没有意识到实现应用程序,并且使用post_save挂钩将所有与实现相关的代码与我们的Order模型隔离开来。

如果我们放弃履行服务,则无需更改核心代码。我们删除履行应用程序,仅此而已。

因此,是否有任何体面的方法来确保post_save信号不会两次触发同一处理程序?


问题答案:

您如何看待该解决方案?

@receiver(post_save, sender=Article)
def generate_thumbnails(sender, instance=None, created=False, **kwargs):

    if not instance:
        return

    if hasattr(instance, '_dirty'):
        return

    do_something()

    try:
        instance._dirty = True
        instance.save()
    finally:
        del instance._dirty        

您也可以创建装饰器

def prevent_recursion(func):

    @wraps(func)
    def no_recursion(sender, instance=None, **kwargs):

        if not instance:
            return

        if hasattr(instance, '_dirty'):
            return

        func(sender, instance=instance, **kwargs)

        try:
            instance._dirty = True
            instance.save()
        finally:
            del instance._dirty

    return no_recursion


@receiver(post_save, sender=Article)
@prevent_recursion
def generate_thumbnails(sender, instance=None, created=False, **kwargs):

    do_something()


 类似资料:
  • 问题内容: 有什么方法可以防止子类覆盖基类中的方法? 我的猜测是没有,但是我来自.NET界,并且我正试图使我的API尽可能健壮,因此,任何输入都将不胜感激。 可以强制执行吗?我知道编译器无济于事,所以也许通过一些运行时检查来解决?还是这不是一种处理事情的Python方法? 问题答案: 您是对的:您的尝试与Python的结构及其文化背道而驰。 记录您的API,并教育您的用户如何使用它。这是他们的程序

  • 我有base/config/services。yaml在我的Symfony 4.3项目中存储了许多服务。例如: 对于我的测试目的,我有配置/测试/test_services.yaml,其中存储带有前缀的服务,以测试私有服务,使它们在test env中公开。 服务之一,在test_服务中声明。yaml没有前缀。它的名称(FQCN)与服务中定义的另一个名称相同。亚马尔。它们具有相同类型的不同构造函数参

  • 问题内容: 有没有一种方法可以使类函数不可重写?类似于java的关键字。即,任何覆盖的类都不能覆盖该方法。 问题答案: 问题是您正在尝试使用Java哲学来用Python编写。有些东西会延续,但不是全部。在Python中,您可以执行以下操作,这非常好,但是完全违反了Java对对象的看法。 如果您确实需要,可以尝试此处发布的代码。但是正如您所看到的,有很多代码可以让它执行您想要的操作。还应注意,即使是

  • 问题内容: 在保存模型之前,我需要重新调整图片大小。但是,如何检查是否添加了新图片或仅更新了说明,以便每次保存模型时都可以跳过重新缩放? 我只想在加载新图像或更新图像时重新缩放,而在更新说明时不想要。 问题答案: 一些想法: 不确定是否可以在所有伪自动django工具中正常运行(例如:ModelForm,contrib.admin等)。

  • 问题内容: 保存模型之前,我需要重新调整图片大小。但是,如何检查是否添加了新图片或仅更新了说明,以便每次保存模型时都可以跳过重新缩放? 我只想在加载新图像或更新图像时重新缩放,而在描述更新时不想要。 问题答案: 一些想法: 不知道它是否可以在所有伪自动django工具中正常运行(例如:ModelForm,contrib.admin等)。

  • 问题内容: 考虑以下简单的DAG: 现在想象一下,我还有其他一些任意准则选择第一个和最后一个边缘,即1-> 2和3-> 4。我想使用这些来查找图表的其余部分。 我可以编写一个递归CTE,如下所示(我使用的是MSDN的术语): 但是,这导致边缘3-> 4被两次选择: 如何防止查询重复出现在已经描述过的子图中?如果在查询的“递归成员”部分中,我可以引用 到目前为止递归CTE检索到的所有数据 (并在递归