2016-09-05 3 views
-1

私はこの素晴らしいテクニックを使って、ビュー内のコードが単純で外部キー依存性を含まないようにORY関係をクエリーセットにカプセル化しています。prefetch_relatedでクエリーセットマネージャーを使用する

ビュー:

vendors_qs = vendors_qs.select_related().prefetch_related('agreement_vendors') 

モデル クラスAgreementVendorsQuerySet(models.query.QuerySet):

def some_filter1(self, option): 
    result = self.filter(.....) 
    return result 

def some_filter2(self, option): 
    result = self.filter(.....) 
    return result 

テンプレート:

しかし、この時間は、私は最高のコードでdescriped次の問題に直面しています
{% for vendor in vendors_qs %} 
    <tr> 
     ... 
     <td> 
      {% for vend_agr in vendor.agreement_vendors.all %} 
       {{vend_agr.serial_number}} 
      {% endfor %} 
     <td> 
    </tr> 
{% endfor %} 

質問は、どのようにしてどこに適用するのですか。ベンダー契約には、prefetch_relatedの関係としてフェッチされているので、を入力してください。何らかの形で、またはビュー自体にフィルタを適用する必要がありますか? 私は明らかに十分な質問を入れていない場合、私はさらに明確にするためにあなたの質問を聞いてきます...

UPDATE: アンナのasnwerは非常に多くの真実のように見えますが、1つの詳細は不明なままです。 if-conditionに基づいていくつかのフィルタを適用したい場合あなたを私ははっきりとあなたの質問を理解していれば、あなたがこの

vendors_qs = vendors_qs.prefetch_related(models.Prefetch('agreement_vendors', queryset=some_filter, to_attr='agreement_vendors_list')) 

ようなものが必要

​​
+0

のように呼び出すことができます。すべてのフィルタを適用することができます。フィルタリングを済ませたらプリフェッチ –

+0

Sardorbekを適用できます。コードスニペットを入力してください。 –

答えて

2

そして、テンプレート内:フィルタは、ベンダーに適用した場合exapmleについては、その後、コードは単純に次のようになりますそれを{% for vend_agr in vendor.agreement_vendors_list %}

+0

もし私があなただったら、それぞれの条件に対して異なるメソッドを持つ 'VendorsQuerySet'を実装し、ビューの' get_queryset'メソッド( 'condition_1'、' condition_2')でそれらをチェックし、適切なメソッドを呼び出します。 –

+0

'some_filter1'メソッドのクエリセットがあります。 –

+0

アンナ、それはqueryset = AgreementVendors.objects.all()である必要があります。some_filter1 –

関連する問題