BLOGサブスレッドの日常

2021.03.09

QuerySet の update() をオーバーライドしたい

torikai

お久しぶりです。鳥飼です。よろしくお願いします。

あるモデルの save() をオーバーライドして、既存の保存処理に追加処理をさせる場面って結構多いですよね。
そして、データを更新する方法って、モデルの save() 以外にもいくつかあります。QuerySetupdate()bulk_update() を使ったりとか。
でも、QuerySetupdate() はモデルの save() 処理を通りません……

QuerySetupdate() もオーバーライドしたい!

オーバーライドする

# -*- 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