どないブログ

なんでも書く

DjangoのQuerySet.update()で既存のデータに特定の処理を加えて更新する

今回やりたかったこと

Djangoで取得したQuerySetのあるフィールドに +1 して bulk_updateしたかった。

やったこと

例として適当に、以下のmodelがあったとする。

class Post(models.Model):
    title = models.CharField(max_length=255)
    order = model.IntegerField()

以下のように3つのPostレコードがある状態を考える。

Post.objects.create(title='post1', order=1)
Post.objects.create(title='post2', order=2)
Post.objects.create(title='post3', order=3)

この時、既存の1番目と2番目の間に新しくレコードを追加する時に 既存の2番目, 3番目のレコードのorderを +1 してupdateしたい。

以下の実装で実現できた。

from django.db.models import F

new_post_order = 2
increment_posts = Post.objects.filter(order__gte=new_post_order)
new_post = Post.objects.create(title='new post', order=new_post_order)
increment_posts.update(order=F('order') + 1)

Djangoのdocumentのupdateの部分に書いてあった。 docs.djangoproject.com

余談

完全に余談ではあるけど、並び替えに関する話を出したので。

並び替えの実装はこの辺りを参考にするとすごくキレイに実装出来て良かった記憶がある。 qiita.com

以上!