2016-04-07 19 views
0

私は同様のモデルがあります:テンプレートでDjango querysetサブセットとカスタムマネージャー?

class BaseInfo(models.Model): 
    is_active = models.BooleanField(default=True) 
    # other fields.. 
    class Meta: 
    abstract = True 

class Customer(BaseInfo): 
    name = models.CharField(max_length=50) 
    ## other fields.. 

を私は、このモデルのテーブルを表示したいが、私は、非アクティブなものを強調したいです。だから私はこの断片をテンプレートに持っています:

{% for c in customers %} 
    <tr {%if not c.is_active %}class="not-active" {%endif%}> 
     <td>..</td> 
    </tr> 
{% endfor %} 

ここで、これの横にアクティブなものを表示します。

all = Customer.objects.filter(name="foo") 
excludeInactive = all.filter(is_active=False) 

をし、コンテキストの両方に合格: 私はビューでこれを行うことができます。 しかし、私は、テンプレート内でこのようなものを好むだろう:

{{customers.exclude_deleted.count}} 

または多分: {{customers.exclude_deleted|length}}を?

私はこの抽象クラスを継承するより多くのモデルを持っています。基本クラスのマネージャーがうまくいくと思いますか?私はちょうど1つを書く方法を理解できませんでした..
また、パフォーマンスについてはどうですか? .filter()を2回呼び出しても、2番目のクエリは既に評価済みのクエリセットのサブセットであっても、2つのdbクエリが実行されますか?

+0

カスタムテンプレートタグをご覧ください –

+0

この目的のためにカスタムマネージャを調べることができます。 – karthikr

答えて

1

さまざまな方法で対応できます。それらのいくつか:

  • ビュー内のすべての計算を行い、コンテキスト作成されたデータに渡す:

    customers = Customer.objects.filter(name="foo") 
    active_customers_count = customers.filter(is_active=True) 
    
  • カスタムテンプレートタグ(docs):

    タグ

    from django import template 
    
    register = template.Library() 
    
    
    @register.assignment_tag 
    def filter_qs(qs, **kwargs): 
        return qs.filter(**kwargs) 
    

    テンプレート

    カスタムクエリセット(docs)と
    {% filter_qs customers is_active=True as active_customers %} 
    {{ active_customers|length }}    
    
  • カスタムマネージャー:

    モデル

    class IsActiveQuerySet(models.QuerySet): 
        def active(self): 
         return self.filter(is_active=True) 
    
    
    class IsActiveManager(models.Manager): 
        def get_queryset(self): 
         return IsActiveQuerySet(self.model, using=self._db) 
    
    
    class Customer(BaseInfo): 
        objects = IsActiveManager() 
        name = models.CharField(max_length=50) 
    

    テンプレート

    {{ customers.active|length }} 
    

私は強く、最初のオプションで行くことにあなたをお勧めします、それは最も "Pythonic"方法でしょう。 とにかくdjangoは上記の解決策のために2つの個別のSQLクエリを作成します。

+1

マネージャのソリューションでは、「アクティブ」から「非アクティブ」に変更することをお勧めします。 –

+0

@JaredGoguenありがとう、それはちょうどタイプミスでした。 – crash843

+0

ちょうど思い出させるために、私は同じテーブル内の非アクティブなものとアクティブなものをしたいと思います。オブジェクトのプロパティをオーバーライドすると、非アクティブなものにアクセスすることはできませんか? – user3599803

関連する問題