我有以下观点:

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

它可以从请求中接收 2 个参数,term 和 adminDivision,然后在 DB 上进行搜索。

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

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

例子,
如果我有这些对象:
  • [event_name='foo', adminDivision='1']
  • [event_name='bar', adminDivision='2']
  • [event_name='foo bar', adminDivision='3']

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

    两个值都为空,我也没有得到任何结果,我想拥有所有这些。

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

    谢谢!

    最佳答案

    您没有得到结果,因为您正在过滤器中执行 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))
    ...
    

    关于python - Django 模型过滤器由一个空字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32467298/

    10-11 01:43