直接のワイルドカードパラメータはないので、あなたが持っているものは完全に受け入れられます。コードの可読性も重要であるため、最終的にコードが増えても、保守性が高くなる可能性があります。
次のようにクエリセットをチェーンできます。
provider = request.POST.get('provider')
order_items = OrderItem.objects.all()
if provider is not None:
order_items = order_items.filter(provider=provider)
kwargs
または、このような呼び出し用に空の辞書を設定することもできますがfilter()
、私の意見では読みにくくなっています。
provider = request.POST.get('provider')
kwargs = {}
if provider is not None:
kwargs['provider'] = provider
order_items = OrderItem.objects.filter(**kwargs)
これは、次のような関数呼び出しに変換できます。
def all_or_filter_args(request, item):
"""Return dictionary of arguments for filter() if item is specified in request."""
value = request.get(item)
if value is None:
return {}
return { item : value }
次に、クエリに使用される次のワンライナー:
order_items = OrderItem.objects.filter(**all_or_filter_args(request, 'provider'))
しかし、繰り返しになりますが、これはあなたが与えた例ほど読みやすいとは思いません。
もう1つのアプローチは、フィルタリングに独自の関数を使用できるカスタムマネージャーを作成することです。カスタムマネージャーを使用すると、次のようなクエリを許可するコードを実装できます。ここでall_or_filtered
、正しいフィルタリングを適用するための関数を提供します。
order_items = OrderItem.objects.all_or_filtered('provider', request.POST.get('provider'))