我的申请中有以下逻辑:
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()
答案 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))