🐈

Djangoで複数フィールドに更新をかけたい時

2022/09/10に公開

下記のようなモデルがあったとします。

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番の方がパフォーマンスはいいのかなと思います。

参考

https://docs.djangoproject.com/en/4.1/ref/models/querysets/#update
https://stackoverflow.com/questions/41744096/efficient-way-to-update-multiple-fields-of-django-model-object
https://thetldr.tech/how-to-update-multiple-fields-in-django-model-efficiently/

Discussion