Difference between auto_now and auto_now_add

PythonDjangoDjango ModelsDjango FormsDjango Templates

Python Problem Overview


What I understood in Django models field's attributes is

  • auto_now - updates the value of field to current time and date every time the Model.save() is called.
  • auto_now_add - updates the value with the time and date of creation of record.

My question is what if a filed in model contains both the auto_now and auto_now_add set to True? What happens in that case?

Python Solutions


Solution 1 - Python

auto_now takes precedence (obviously, because it updates field each time, while auto_now_add updates on creation only). Here is the code for DateField.pre_save method:

def pre_save(self, model_instance, add):
    if self.auto_now or (self.auto_now_add and add):
        value = datetime.date.today()
        setattr(model_instance, self.attname, value)
        return value
    else:
        return super().pre_save(model_instance, add)

As you can see, if auto_now is set or both auto_now_add is set and the object is new, the field will receive current day.

The same for DateTimeField.pre_save:

def pre_save(self, model_instance, add):
    if self.auto_now or (self.auto_now_add and add):
        value = timezone.now()
        setattr(model_instance, self.attname, value)
        return value
    else:
        return super().pre_save(model_instance, add)

Solution 2 - Python

These fields are built into Django for expressly this purpose — auto_now fields are updated to the current timestamp every time an object is saved and are therefore perfect for tracking when an object was last modified, while an auto_now_add field is saved as the current timestamp when a row is first added to the database and is therefore perfect for tracking when it was created.

Solution 3 - Python

According to the django documentation using both auto_now and auto_now_add in your model fields as True will result in an error because they are both mutually exclusive.

Solution 4 - Python

As Official Django documentation says -

auto_now, auto_now_add and default are mutually exclusive and will result in an error if used together

Solution 5 - Python

If a filed in a model contains both the auto_now and auto_now_add set to True will result in an error like this:

ERRORS: appname.Model.field_name: (fields.Efield_number) The options auto_now, auto_now_add, and default are mutually exclusive. Only one of these options may be present.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSukumarView Question on Stackoverflow
Solution 1 - PythonawesoonView Answer on Stackoverflow
Solution 2 - PythonAlphonse PrakashView Answer on Stackoverflow
Solution 3 - PythonOladapo Oluwaseyi BolarinwaView Answer on Stackoverflow
Solution 4 - PythonHarshit GangwarView Answer on Stackoverflow
Solution 5 - PythonMd Moksedul AlamView Answer on Stackoverflow