Temporarily disable auto_now / auto_now_add

后端 未结 12 1214
刺人心
刺人心 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:16

    I used the suggestion made by the asker, and created some functions. Here is the use case:

    turn_off_auto_now(FooBar, "lastupdatetime")
    turn_off_auto_now_add(FooBar, "createtime")
    
    new_entry.createtime = date
    new_entry.lastupdatetime = date
    new_entry.save()
    

    Here's the implementation:

    def turn_off_auto_now(ModelClass, field_name):
        def auto_now_off(field):
            field.auto_now = False
        do_to_model(ModelClass, field_name, auto_now_off)
    
    def turn_off_auto_now_add(ModelClass, field_name):
        def auto_now_add_off(field):
            field.auto_now_add = False
        do_to_model(ModelClass, field_name, auto_now_add_off)
    
    def do_to_model(ModelClass, field_name, func):
        field = ModelClass._meta.get_field_by_name(field_name)[0]
        func(field)
    

    Similar functions can be created to turn them back on.

提交回复
热议问题