Django通配符查询

时间:2013-03-26 23:24:50

标签: python mysql django

我的申请中有以下逻辑:

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()

2 个答案:

答案 0 :(得分: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'))

但是,我发现这并不像你给出的例子那样可读。

另一种方法是编写custom manager,允许您使用自己的函数进行过滤。使用自定义管理器,您可以实现代码以允许这样的查询,其中您为all_or_filtered提供了一个函数来应用正确的过滤:

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

答案 1 :(得分:1)

这个怎么样......

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