用Django比对字符串和数据库字段
在Django中,我们怎么检查数据库里是否有特定的词呢?
比如说,如果数据库的classs这一列里包含了'hello,welcome,world'。如果我发送一个请求?q=welcome,我该怎么检查数据库的classs这一列里是否有'欢迎'这个词呢?
views.py
from django.shortcuts import render
from django.http import HttpResponse
from airapp.models import Travel
from django.db.models import Q
def search_form(request):
return render(request, 'search_form.html')
def search(request):
if 'f' in request.GET and request.GET['f']:
q = request.GET['f']
r = request.GET['t']
s = request.GET['c']
books = Travel.objects.filter(Q(classs__contains=s),
froms__icontains=q,to=r)
return render(request, 'search_results.html',
{'books': books, 'query': q})
else:
return HttpResponse('Please submit a search term.')
models.py
from django.db import models
class Travel(models.Model):
froms = models.CharField(max_length=30)
to = models.CharField(max_length=30)
classs = models.CharField(max_length=20)
details = models.CharField(max_length=3330)
def __unicode__(self):
return self.froms
seach_form.html
<html>
<head>
<title>Search</title>
<script language="JavaScript" type="text/javascript" src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
<script language="JavaScript" type="text/javascript">
$(function() {
$("#search-form").submit(function() {
var from = $("#search-form :input[name='f']").val();
var tos = $("#search-form :input[name='t']").val();
var clas = $("#search-form :input[name='c']").val();
$.get("/search/", { f : from, t:tos, c:clas })
.done(function(data) {
$("#search-result").html(data);
$("#search-result").show();
});
return false;
})});
</script>
</head>
<body>
<form id="search-form">
FROM<input type="text" name="f"><br>
TO<input type="text" name="t"><br>
CLASS<input type="text" name="c"><br>
<input type="submit" value="Search">
</form>
<div id="search-result" style="display:none">
</div>
</body>
</html>
我该怎么用Django的查询来检查呢?
1 个回答
1
首先,contains
和icontains
的区别在于,icontains
是不区分大小写的版本。它们都可以用来匹配部分字符串,比如:
Entry.objects.get(headline__contains='Lennon')
这对应于SQL中的
SELECT ... WHERE headline LIKE '%Lennon%';
(来自Django文档)
如果你想要匹配的是列中的完整字符串,而不是部分字符串,可以使用exact
或iexact
,分别对应区分大小写和不区分大小写的匹配。
如果你的类的列中包含多个用逗号分隔的条目,那就有点复杂了。我想你可以确保每个条目后面都有一个逗号(包括最后一个),然后可以查询“welcome,”,虽然这样做有点不太正规。不过,我还是不太确定这是否是你想要解决的问题。