用Django比对字符串和数据库字段

1 投票
1 回答
2717 浏览
提问于 2025-04-18 07:36

在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

首先,containsicontains的区别在于,icontains是不区分大小写的版本。它们都可以用来匹配部分字符串,比如:

Entry.objects.get(headline__contains='Lennon')

这对应于SQL中的

SELECT ... WHERE headline LIKE '%Lennon%';

(来自Django文档)

如果你想要匹配的是列中的完整字符串,而不是部分字符串,可以使用exactiexact,分别对应区分大小写和不区分大小写的匹配。

如果你的类的列中包含多个用逗号分隔的条目,那就有点复杂了。我想你可以确保每个条目后面都有一个逗号(包括最后一个),然后可以查询“welcome,”,虽然这样做有点不太正规。不过,我还是不太确定这是否是你想要解决的问题。

撰写回答