2013-03-26 2 views
0

Я следующую логику в моем приложении:Django подстановочные запрос

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

Есть ли подстановочные я могу использовать в Джанго, так что, если не провайдер не найден в POST запроса, он будет возвращать все объекты для Это?

Другими словами, есть ли способ сделать это?

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

Что случилось с версией вы показываете? –

+0

Я должен сделать это десять раз или около того. Это упростит ситуацию. – David542

+0

'' LIKE% something% "' - это SQL для подстановочных знаков ("%"), знак процента похож на "*" –

ответ

4

Там нет прямого параметра группового символа, так что у вас есть вполне приемлем. Читаемость кода также учитывается, поэтому, даже если вы можете получить больше кода, он может быть более удобным.

Вы можете приковать 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')) 
1

Как об этом ...

parameter = request.POST.get('provider', '%%') 
order_items = OrderItem.objects.raw("SELECT * FROM %s WHERE provider LIKE '%s'" % (OrderItem._meta.db_table, parameter)) 
+0

Я тестировал ваш ответ, но не работал – catherine

+0

Очень хорошо работает на моем ПК. Вы получаете какую-либо ошибку или как она себя ведет? –

+0

У меня нет ошибок. Вывод '[]' empty. Подождите, я попробую что-нибудь – catherine

Смежные вопросы