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
なんだから、更新してくれてもいいのになぁなんて、思ったりしますが、どうなんでしょう。