【问题标题】:In Django, how do I avoid/skip/undo a pre-save event?在 Django 中,如何避免/跳过/撤消预保存事件?
【发布时间】:2014-09-24 17:34:25
【问题描述】:

我正在使用django_extensions TimeStampedModel,它提供了一个modified 字段,该字段通过pre_save 事件设置自己。这很好,除了我正在转换旧模式并希望保留原始的modified 日期戳。我如何才能修补、避免、取消或将 pre_save 修改为另一个值?

【问题讨论】:

  • 如果它是你创建的 pre_save 信号,你能不能 - 也许传递一个 kwarg 来不覆盖时间戳?或者,如果它是第 3 方应用程序的信号,请不要全部使用,使用自定义代码创建自己的 - 免责声明 - 这只是一个想法。我可能无法理解您要做什么..

标签: django django-orm django-extensions


【解决方案1】:

最后,我只是做了一个结束:

from django.db import connection
cursor = connection.cursor()
cursor.execute("update %s set modified='%s' where id=%s" % (
    my_model._meta.db_table, desired_modified_date, my_model.id))

【讨论】:

    【解决方案2】:

    你不能。不是你问的那个意思。

    您可以创建一个假字段并将其填充到clean()

    Class MyModel(models.Model):
    
        def clean(self):
            self._modified = self.modified
    
    ...
    
    @receiver(pre_save, sender=MyModel)
    def receiver_(self, *args, **kwargs):
        self.modified = self._modified
    

    因此,您要备份字段值并稍后将其放回原处。 注意事项:确保您的应用程序稍后加载。

    【讨论】:

    • “确保您的应用程序加载较晚”?
    • 我试过这样做,它在另一个pre_save之前运行...我怎么能影响订单?
    • 您不能影响订单。认为它是执行代码。您必须以某种方式确保应用程序的代码在时间戳扩展之后运行,因此在时间戳扩展中调用connect 的代码之后调用为您的应用调用connect(信号)的代码。
    猜你喜欢
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2023-03-31
    • 2012-08-08
    • 1970-01-01
    • 2014-12-23
    相关资源
    最近更新 更多