Posted at

Djangoのauto_nowなのにアップデートされないことがある

More than 1 year has passed since last update.

Djangoのモデルには、DateTimeFieldがあり、その引数として、



  • auto_now_add : create時に現在時刻を入れる


  • auto_add : save時に現在時刻を入れて更新する

という便利な機能があります。よく

class User(models.Model):

name = models.CharField()
created = models.DateTimeField(
auto_now_add=True
)
updated = models.DateTimeField(
auto_now=True
)

のような形で定義して、使っています。


auto_nowで更新される

このようなフィールドを持ったモデルで

user = User.objects.create(name="kasajei")

print(user.created)
>>> 現在時刻
print(user.updated)
>>> 現在時刻
user.name = "kasajei2"
user.save()
print(user.updated)
>>> 保存した時刻

となり、updatedには現在の時刻を設定して、saveしなくてもDjangoが値を入れて更新してくれます。便利!


auto_nowなのに、更新されない

しかし、たまーに、更新されないなぁと思っていたら、以下の用に、updateで引数を指定するようなケースでは更新をしてくれないみたいです

user.name="kasajei3"

user.save(update_fields="name")
print(user.updated)
>>> 更新されてない!!

他にも、

User.objects.filter(name="kasajei").update(name="kasajei2")

user = User.objects.get(name="kasajei2")
print(user.updated)
>>> 更新されてない!!

なども更新されません!

ちゃんと発行されているSQL見ればわかるのですが、auto_nowを信用しすぎていて、しばらく気づきませんでした。

auto_nowなんだから、更新してくれてもいいのになぁなんて、思ったりしますが、どうなんでしょう。