1

私のアプリケーションには次のロジックがあります。

provider = request.POST.get('provider', '*')
order_items = OrderItem.objects.filter(provider=provider)

djangoで使用できるワイルドカードはありますか?リクエストにプロバイダーが見つからない場合、POSTすべてのオブジェクトが返されますか?

言い換えれば、これを達成する方法はありますか?

if request.POST.get('provider'):
    order_items = OrderItem.objects.filter(provider=provider)
else:
    order_items = OrderItem.objects.all()
4

2 に答える 2

4

直接のワイルドカードパラメータはないので、あなたが持っているものは完全に受け入れられます。コードの可読性も重要であるため、最終的にコードが増えても、保守性が高くなる可能性があります。

次のようにクエリセットをチェーンできます。

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'))
于 2013-03-27T12:30:04.417 に答える
1

これはどう...

parameter = request.POST.get('provider', '%%')
order_items = OrderItem.objects.raw("SELECT * FROM %s WHERE provider LIKE '%s'" %   (OrderItem._meta.db_table, parameter))
于 2013-03-27T08:53:41.200 に答える