Там нет прямого параметра группового символа, так что у вас есть вполне приемлем. Читаемость кода также учитывается, поэтому, даже если вы можете получить больше кода, он может быть более удобным.
Вы можете приковать QuerySet так:
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'))
Но опять же, я не считаю это читаемыми в качестве примера вы дали.
Другой подход заключается в том, чтобы написать custom manager, который позволяет использовать ваши собственные функции для фильтрации. С пользовательского менеджера вы можете реализовать код, чтобы запросы, как это, где вы обеспечиваете функцию all_or_filtered
применять правильную фильтрацию:
order_items = OrderItem.objects.all_or_filtered('provider', request.POST.get('provider'))
Что случилось с версией вы показываете? –
Я должен сделать это десять раз или около того. Это упростит ситуацию. – David542
'' LIKE% something% "' - это SQL для подстановочных знаков ("%"), знак процента похож на "*" –