プログレッシブ・プロレタリアート

無産階級エンジニアが生きる知恵をはき出すブログ

Djangoのfilterとかexcludeをoverrideしたい

そういう需要があるかどうか分かりませんがfilterやexcludeをoverrideして特定のModelに対するquery発行時に必ずなんらかの処理を入れる方法です。

python: 3.6
Django:1.11

models.py
class MyModel(models.Model):
    objects =  ObjectsManager.as_manager()


class ObjectsManager(models.QuerySet):
    def filter(self, *args, **kwargs):
        # argsとkwardsにQobjectsやdictが来ているのでそこを上手いこと処理する
        return super().filter(*args, **kwargs)

    def exclude(self, *args, **kwargs):
        # argsとkwardsにQobjectsやdictが来ているのでそこを上手いこと処理する
        return super().exclude(*args, **kwargs)

多分これでうまいこと行きます。

ちなみにこれはどんな場合でもfilterやexcludeを動かすときは必ずこのような処理が走って欲しい!!!って時専用になります。(もう今までのfilterはどこからも動きません)

filterっぽいものを作りたいときは objectsではなく違う名前で宣言してみましょう。

models.py
class MyModel(models.Model):
    objects2 =  ObjectsManager.as_manager()


class ObjectsManager(models.QuerySet):
    def filter(self, *args, **kwargs):
        return super().filter(*args, **kwargs)

    def exclude(self, *args, **kwargs):
        return super().exclude(*args, **kwargs)


 MyModel.objects2.filter(order='spam')

【PR】 sora tob sakana というアイドルグループのPVがとてもよいです。 今度ハイスコアガールというアニメに使われるみたいです。 この記事が役に立ったよって人は是非見ていただけると幸いです