Djangoで簡単なアプリケーションを作成しています。また、ある種の操作を頻繁に行っていることに気づきました。たとえば、isPublick = Trueを持つすべてのArticleオブジェクトを取得する必要があることがよくあります。だから私はモデルでget_published関数を定義することは可能だと思いますか?
モデルがこのように見える場合(簡略化)
class Article(models.Model):
title = models.CharField(...)
isPublished = models.BooleandField()
def get_active(self):
return Article.objects.filter(isPublicshed = 1)
しかし、それはこのようには機能しません
関数を実装する方法を提案できますか?
おそらく必要なのは カスタムマネージャー
Djangoドキュメントから:
# An example of a custom manager called "objects".
class PersonManager(models.Manager):
def get_fun_people(self):
return self.filter(fun=True)
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
fun = models.BooleanField()
objects = PersonManager()
def __unicode__(self):
return u"%s %s" % (self.first_name, self.last_name)
これにより、次のようなことができます。
>>> p1 = Person(first_name='Bugs', last_name='Bunny', fun=True)
>>> p1.save()
>>> p2 = Person(first_name='Droopy', last_name='Dog', fun=False)
>>> p2.save()
>>> Person.objects.get_fun_people()
[<Person: Bugs Bunny>]
ここのドキュメント で述べられているように、カスタム行レベル機能をオブジェクトに追加する必要がある場合は、モデルにカスタムメソッドを定義します。ただし、求めているのがカスタムtable-wide機能(特定の条件を満たすすべてのArticleオブジェクトの取得など)である場合は、カスタムメソッドを定義する必要がありますon model Managers (上記のaciniglioが回答で指摘しているように)。
Staticmethodデコレータを使用できます。
class Article(models.Model):
title = models.CharField(...)
isPublished = models.BooleandField()
@staticmethod
def get_active():
return Article.objects.filter(isPublished = 1)