BLOGサブスレッドの日常
2021.03.09
QuerySet の update() をオーバーライドしたい
torikai
お久しぶりです。鳥飼です。よろしくお願いします。
あるモデルの save() をオーバーライドして、既存の保存処理に追加処理をさせる場面って結構多いですよね。
そして、データを更新する方法って、モデルの save() 以外にもいくつかあります。QuerySet の update() や bulk_update() を使ったりとか。
でも、QuerySet の update() はモデルの save() 処理を通りません……
QuerySet の update() もオーバーライドしたい!
オーバーライドする
# -*- coding:utf-8 -*-
from datetime import datetime
from django.db import models
class ProductQuerySet(models.query.QuerySet):
def update(self, **kwargs):
# do something
return super().update(**kwargs)
class ProductManager(models.manager.BaseManager.from_queryset(ProductQuerySet)):
pass
class Product(models.Model):
name = models.CharField('製品名', max_length=100, blank=True, null=False, default='')
objects = ProductManager()
モデルのマネージャクラス、モデルのマネージャの QuerySet クラスをそれぞれ用意して、オーバーライドします。
bulk_update() は処理の内部で update() を呼び出しているので、bulk_update() を別途オーバーライドする必要はありません。
QuerySet はよくお世話になるクラスなので、他にも色々拡張しどころがありそうです。
今日のひとネタでした。
この記事を書いた人
torikai
