在Python/Django中使用数据库查询进行多列搜索?
我有一个这样的模型:在Python/Django中使用数据库查询进行多列搜索?,django,search,Django,Search,我有一个这样的模型: 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
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()
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('/')
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('/')
用户可以使用相同的搜索输入框从磁带中搜索id、姓名、导演和摄影师。
我有这样一个搜索视图:
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()
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('/')
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('/')
一开始我以为它会起作用,但事实并非如此。第一个res变量可以包含该值,而最后一个res为空,将返回到no_results.html
。我想使用相同的输入框部署此搜索。如何使其工作?建议在过滤器中应用或条件。有关语法,您可以参考
Q(question__startswith='Who') | Q(question__startswith='What')
它将确保您在结果中获得唯一的对象列表。首先,您需要导入Q以用于或筛选:
from django.db.models import Q
那么您的代码应该如下所示:
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()
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('/')
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('/')
您知道您正在用这些查询中的每一个重写res
,对吗?无论如何,使用Q
进行或
查询。是的,我意识到,我对Q一无所知。谢谢,伙计!就我而言,我该怎么做?Q(Info.objects.filter(tape_id__确切=search_inp))?是的。就这样。非常感谢。