Django - Model に property を追加した時にやっておくこと
投稿日: 2023/01/30
更新日: 2023/01/30
更新日: 2023/01/30
概要
モデルにプロパティを追加した時に一緒にやっておいた方がいいこと。
例
下記のような顧客モデルがあった時に、 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 も追加しておこう。