Django - Model に property を追加した時にやっておくこと

投稿日: 2023/01/30
更新日: 2023/01/30
シェア:

URL copied!


概要

モデルにプロパティを追加した時に一緒にやっておいた方がいいこと。

下記のような顧客モデルがあった時に、 xxx を持っている顧客かどうかを判定するプロパティ( is_xxx ) が必要になったので追加したとする。

from django.db import models

class Customer(models.Model):
    ...
    xxx = models.CharField(
        "XXX",
        max_length=100,
        null=True,
        blank=True,
    )
    ...

    @property
    def is_xxx(self):
        return True if self.xxx else False

この後、is_xxx な顧客を取得したいとなった時に

Customer.objects.filter(xxx__isnull=False)

として、プロパティを参考にクエリを作成し取得することができる。しかし、万が一プロパティが変わった時にこのfilterをしている箇所を探すのは面倒である。

Manager を一緒に設定

同一ファイル内に Manager を作っておくことで責任が分散しなくて済む。

from django.db import models

class CustomerManager(models.Manager):

    def is_xxx(self):
        return self.get_queryset().filter(xxx__isnull=False)


class Customer(models.Model):
    ...
    xxx = models.CharField(
        "XXX",
        max_length=100,
        null=True,
        blank=True,
    )
    ...
    objects = CustomerManager()

    @property
    def is_xxx(self):
        return True if self.xxx else False

上記のようにしておくことで、クエリは下記のようにできる。

Customer.objects. is_xxx()

このようにすることで、他のファイルでも条件を考慮せずに使えるようになる。

まとめ

プロパティを追加したら Manager も追加しておこう。