简体   繁体   English

使用Python / Django中的数据库查询在多列中搜索?

[英]Search in multiple columns using database query in Python/Django?

I have a model like this: 我有一个这样的模型:

class Info(models.Model):
    tape_id = models.TextField()
    name = models.TextField()
    video_type = models.TextField()
    date = models.DateTimeField()
    director = models.CharField(max_length=255)
    cameraman = models.CharField(max_length=255)
    editor = models.CharField(max_length=255)
    time_code = models.TextField()
    tag1 = models.TextField()

User can search from tape_id, name, director and cameraman using the same search input box. 用户可以使用相同的搜索输入框从tape_id, name, director and cameraman进行搜索。 I have a search view like this: 我有这样的搜索视图:

 if request.method == 'POST':
        search_inp = request.POST['search_box']
        tape_id = Info.objects.filter(tape_id__exact=search_inp)
        res = Info.objects.filter(name__icontains=search_inp)
        res = Info.objects.filter(director__icontains=search_inp)
        res = Info.objects.filter(cameraman__icontains=search_inp)
        total_video = res.count()
        if len(res) == 0 and len(tape_id) == 0 :
            result = "No videos found!!"
            return render_to_response('no_results_only.html', {'result':result}, context_instance=RequestContext(request))
        else:
            date1 = [i.date for i in res]
            date = [i.strftime("%B %d, %Y") for i in date1]
            a = zip(res, date)
            return render_to_response('list_videos.html', {'a':a, 'total_video':total_video}, context_instance=RequestContext(request))
        return HttpResponseRedirect('/')

I thought it would work at first but it doesn't. 我以为一开始它会工作,但没有。 First res variable can contain the value whereas the last res be empty which will return to the no_results.html . 第一个res变量可以包含值,而最后一个res可以为空,这将返回no_results.html I want to deploy this search using the same input box. 我想使用相同的输入框部署此搜索。 How can I make this work? 我该如何进行这项工作?

First you need to import Q to use for OR filtering: 首先,您需要导入Q以用于OR过滤:

from django.db.models import Q

Then your code should look like this: 然后您的代码应如下所示:

if request.method == 'POST':
    search_inp = request.POST['search_box']
    res = Info.objects.filter(
        Q(tape_id__exact=search_inp) | 
        Q(name__icontains=search_inp) |
        Q(director__icontains=search_inp) |
        Q(cameraman__icontains=search_inp)
    )
    total_video = res.count()
    if len(res) == 0:
        result = "No videos found!!"
        return render_to_response('no_results_only.html', {'result':result}, context_instance=RequestContext(request))
    else:
        date1 = [i.date for i in res]
        date = [i.strftime("%B %d, %Y") for i in date1]
        a = zip(res, date)
        return render_to_response('list_videos.html', {'a':a, 'total_video':total_video}, context_instance=RequestContext(request))
    return HttpResponseRedirect('/')

It is recommended to apply OR conditions in the filter . 建议在filter应用“ OR条件。 You can refer the documentation for the syntax. 您可以参考文档中的语法。

Q(question__startswith='Who') | Q(question__startswith='What')

It will make sure that you will get an unique list of objects in the result. 这将确保您将在结果中获得唯一的对象列表。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM