web-dev-qa-db-ja.com

Djangoモデル、カスタム関数

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)

しかし、それはこのようには機能しません

関数を実装する方法を提案できますか?

23
Oleg Tarasenko

おそらく必要なのは カスタムマネージャー

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>]
66
aciniglio

ここのドキュメント で述べられているように、カスタム行レベル機能をオブジェクトに追加する必要がある場合は、モデルにカスタムメソッドを定義します。ただし、求めているのがカスタムtable-wide機能(特定の条件を満たすすべてのArticleオブジェクトの取得など)である場合は、カスタムメソッドを定義する必要がありますon model Managers (上記のaciniglioが回答で指摘しているように)。

13
ayaz

Staticmethodデコレータを使用できます。

class Article(models.Model):
    title = models.CharField(...)
    isPublished = models.BooleandField()

    @staticmethod
    def get_active():
        return Article.objects.filter(isPublished = 1)
13
David