2012-07-23 7 views
5

ベストプラクティスがあるかどうか、またはこれを達成するための推奨方法があるのは不思議です。Django - モデルのフィルタをオーバーライドする方法は?

私はこのようなモデルがあるとしましょう:

class Cat(models.Model): 
    field1=models.CharField(...) 
    field2=models.CharField(...) 
    evil=models.BooleanField(...) 

私が達成しようとしている何が私は景色が今まで悪がTrueである猫のレコードにアクセスすることはできないにしたいです。

すべてのCat.objects.filterコールに.filter(evil = False)を追加する必要がありますか、それともクラスで一度やり直して悪意のある猫をどこにも見せないようにする方法がありますか?

+1

私はカスタムマネージャがここに行くための方法だと思います。https://docs.djangoproject.com/en/dev/topics/db/managers /#custom-managers – Jingo

+0

私は@Jingoに同意します。それを答えて、あなたは私の投票を持っています。 –

+0

Jingoありがとうございます。それは有望に見えます。それがうまくいくなら私はここで私自身の答えを書くでしょう。他の誰かが別のアイデアを持っていれば、私はまだ興味があるだろうが、私はこれを撃つだろう。 – Greg

答えて

8

いいえ、カスタムマネージャーはここに入ります。 docsをご覧ください。 Chris Pratt氏のように、最初のマネージャーがデフォルトのマネージャーになることに注意してください。

これが正しい方向につながることを願っています。

更新(多分あなたはこのようにそれを行うことができます):

from django.db import models 

class EvilCategoryManager(models.Manager): 
    def get_query_set(self): 
     return super(EvilCategoryManager, self).get_query_set().filter(evil=False) 

class Cat(models.Model): 
    #.... atrributes here 
    objects = models.Manager() 
    no_evil_cats = EvilCategoryManager() 
+0

ありがとう、あなたはスーパーを返すのですか?(EvilCategoryManager ...? – Greg

+0

私のタイプミスを編集したばかりです。 – Jingo

+1

「super(EvilCategoryManager、self).filter(evil = False)」を返すのはなぜですか? – kosii

関連する問題