🐈
Djangoで複数フィールドに更新をかけたい時
下記のようなモデルがあったとします。
import uuid
from django.db import models
class Author(models.Model):
uuid = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False)
name = models.CharField(max_length=200)
email = models.EmailField()
1つのフィールドに更新をかけるだけだったら、
author = Author.objects.get(pk="88da5e5d-c29f-31f5-6ede-bb390d1e8b9c")
author.name = "更新後の名前"
author.save()
と書くことができますが、複数フィールドに同時に更新かけたい時ってどうやればいいんだろうと悩んだのでまとめます。
1. filterで絞ったレコードをupdate()する
data = {
"name": "更新後の名前",
"email": "updatedemail@example.jp"
}
Author.objects.filter(pk="88da5e5d-c29f-31f5-6ede-bb390d1e8b9c").update(**data)
ちなみに、getで取得できるのはオブジェクトですが、filterで取得できるのはQuerySetというオブジェクトのリストですね。
2. setattrを使う
data = {
"name": "更新後の名前",
"email": "updatedemail@example.jp"
}
author = Author.objects.get(pk="88da5e5d-c29f-31f5-6ede-bb390d1e8b9c")
for key, value in data.iteritems():
setattr(author, key, value)
author.save()
2番だと2回DBを呼んでるんですよね。1番の方がパフォーマンスはいいのかなと思います。
参考
Discussion