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