Temporarily disable auto_now / auto_now_add

后端 未结 12 1217
刺人心
刺人心 2020-12-12 17:49

I have a model like this:

class FooBar(models.Model):
    createtime = models.DateTimeField(auto_now_add=True)
    lastupdatetime = models.DateTimeField(auto         


        
12条回答
  •  甜味超标
    2020-12-12 18:28

    I went the context manager way for reusability.

    @contextlib.contextmanager
    def suppress_autotime(model, fields):
        _original_values = {}
        for field in model._meta.local_fields:
            if field.name in fields:
                _original_values[field.name] = {
                    'auto_now': field.auto_now,
                    'auto_now_add': field.auto_now_add,
                }
                field.auto_now = False
                field.auto_now_add = False
        try:
            yield
        finally:
            for field in model._meta.local_fields:
                if field.name in fields:
                    field.auto_now = _original_values[field.name]['auto_now']
                    field.auto_now_add = _original_values[field.name]['auto_now_add']
    

    Use like so:

    with suppress_autotime(my_object, ['updated']):
        my_object.some_field = some_value
        my_object.save()
    

    Boom.

提交回复
热议问题