7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?