Django模型过滤空字符串

时间:2015-09-08 21:10:58

标签: python django

我有以下观点:

def search_events(request):
    term = request.GET.get('term', '')
    adminDivision = request.GET.get('adminDivision', '')
    events = Event.objects.filter(event_name__icontains=term, city__admin1=adminDivision)
    data= serializers.serialize('json', events);
    return HttpResponse(data, content_type='application/json')

它可以从请求,术语和adminDivision接收2个参数,然后在数据库上进行搜索。

现在它的工作方式是,当其中一个是空的,term或adminDivision时,我得不到任何结果,因为所有对象对这些字段都有一些价值。

我想要的是,如果一个或两个过滤器都为空,则不要应用该过滤器。

实施例, 如果我有这些对象:

  • [event_name =' foo',adminDivision =' 1']
  • [event_name =' bar',adminDivision =' 2']
  • [event_name =' foo bar',adminDivision =' 3']

目前term=foo(没有adminDivision值),我没有得到任何结果,但我希望它能返回第一个和第三个。

如果这两个值都是空的,我也没有得到任何结果,而且我想拥有它们。

有没有一种优雅的方法来实现这一目标?

谢谢!

1 个答案:

答案 0 :(得分:1)

由于您在过滤器中执行了AND查询,因此无法获得结果。试试这样:

def search_events(request):
    term = request.GET.get('term', '')
    adminDivision = request.GET.get('adminDivision', '')
    events = Event.objects.all()
    if term:
        events = events.filter(event_name__icontains=term)
    if adminDivision:
        events = events.filter(city__admin1=adminDivision)
    data= serializers.serialize('json', events);
    return HttpResponse(data, content_type='application/json')

或者:

from django.db.models import Q

...
events = Event.objects.filter(Q(event_name__icontains=term)|Q(city__admin1=adminDivision))
...