2009-09-03 11 views
17

私はdjangoで簡単なアプリケーションを作成しています。また、何らかの操作を非常に頻繁にやっていることに気付きました。たとえば、私はしばしばisPublick = Trueを持つArticleオブジェクトをすべて取得する必要があります。だから私はモデルでget_published関数を定義することは可能ですか?Djangoモデル、カスタム関数

モデルは、この(簡体字)

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

    def get_active(self): 
     return Article.objects.filter(isPublicshed = 1) 

のように見えるが、それはこのよう

動作しない場合は、機能を実現する方法を提案することはできますか?あなたはおそらく欲しい

答えて

53

は、Djangoのドキュメントからcustom manager

です:あなたが何か行うことができます

 # 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) 

docs hereに記載されたよう

>>> 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>] 
+3

良いコード例。私には以前は無意味に思えたジャンゴの一部を簡潔に説明しました。 +1。 – chucksmash

12

を、カスタム行レベルの機能をオブジェクトに追加する必要がある場合は、自分のモードでカスタムメソッドを定義する必要がありますls。しかし、後で何かがカスタムテーブル全体機能(特定の条件に適合するすべてのアーティクルオブジェクトを取得するなど)である場合は、model Managersにカスタムメソッドを定義する必要があります(答えはaciniglioと答えています)。

11

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

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

    @staticmethod 
    def get_active(): 
     return Article.objects.filter(isPublished = 1) 
+0

これをお寄せいただきありがとうございます!私の別の質問に答えました。 – alexsalo

+1

これは代わりに 'classmethod'でなければなりません。 –

関連する問題