2016-05-28 8 views
0

Managerの__init__メソッドでモデルのQuerySetを取得して、QuerySet結果のページ付けを設定したいとします。 __init__メソッドでページ設定を設定したいのは、getPagegetNumberOfPagesなどのような単純なメソッドを抽象化を簡略化するためにマネージャに単純なメソッドがたくさんあり、これらのメソッド全体でPaginatorを設定するコードを複製したくないからです。例えばDjangoのマネージャのinitメソッドでQuerySetにアクセスできません

、のカスタムArticleManagerを持っており、それは多少このようになりますArticleモデルがあるとしましょう:super(ArticleManager, self).get_queryset()でこのコードの

class ArticleManager(models.Manager): 
    def __init__(self): 
     super(ArticleManager, self).__init__() 
     allObjects = super(ArticleManager, self).get_queryset() 
     self.articlePaginator = Paginator(allObjects, 10) 


class Article(models.Model): 
    # blah blah 
    # Model fields everywhere 
    objects = ArticleManager() 

4行目はAttributeError例外を返します:

AttributeError: 'NoneType' object has no attribute '_meta' 

Managerを適切に初期化するために何かをしておく必要がありますが、それが何であるか分かりません。私はDjangoのドキュメントや他のStackOverflowの質問に似たものは何も見つかりませんでした。また、私のアプローチでは何かが間違っているかもしれないと思うので、もしそうなら、もし誰かがそれを指摘してくれたら、私は感謝しています。

+2

あなたのアプリケーションを読み込むとマネージャーが作成され、それは永遠に残っています。これは一時的な状態を持つ適切な場所ではありません。 – spectras

+0

真。今のところ私は@Anonymousが彼の返答で言ったように、なぜ私がinitでそれを例えばプロパティにするのではなく、それを欲しがっているのか分かりません。私はPythonに費やす時間が長すぎると思う。 –

答えて

1

あなたは親のget_query()メソッドを呼び出しています。あなたはそれを上書きしていないので、ポイントはありません。ちょうどそれをselfと呼んでください。さらに良いことに、この操作を怠惰にする。プロパティはオプションです:

class ArticleManager(models.Manager): 
    @property 
    def article_paginator(self): 
     return Paginator(self.get_queryset(), 10) 

Article.objects.article_paginatorでアクセスできます。

+0

これに数回アクセスすると、毎回クエリがトリガされますが、注意してください。原則として、私はクエリをトリガする何かのためのプロパティを使用しないようにしようとします。メソッド呼び出しは、起こっていることをより明示的に示します。 – spectras

+0

実際には何も起動しません。 'get_queryset()'は怠惰です(そうでなければ、長いクエリをビルドすると毎回呼び出しが呼び出されます)。そして[ページ移動のコンストラクタ](https://github.com/django/django/blob/79a091820f46f00cba217a9e05daec855272c3ad/django/core/paginator)。 py)。 – Anonymous

+1

コールが空にない場合を除いて、ページャーにアクセスして使用します。 'Article.objects.article_paginator.count'と' Article.objects.article_paginator.num_pages'を実行すると、2つのクエリがトリガされたばかりです。それは通常のプロパティのように見えるので明らかではありません。 – spectras

関連する問題