没有直接的通配符参数,因此您所拥有的完全可以接受。代码可读性也很重要,因此即使您最终可能会获得更多代码,它也可能更易于维护。
您可以像这样链接查询集:
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'))