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

但同样,我觉得这不像你给出的例子那样可读。

另一种方法是编写一个自定义管理器,它允许您使用自己的函数进行过滤。使用自定义管理器,您可以实现代码以允许这样的查询,您可以在其中提供一个函数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 回答