Django Raw SQL没有获取ID

时间:2015-11-26 21:45:59

标签: python django

我试图从搜索中获取数据库表中的信息。在网站上,我正在为用户工作,在搜索框中输入一些文本,并提供结果列表,然后他们可以单击以查找更多信息。现在让我感到困惑的是,我可以使用以下代码完美地完成这项工作:

views.py

from models import Person
from django.template.loader import get_template 
from django.template import Context

def search(request):
   q = request.GET.get("q")
if q:
   results = Person.objects.filter(name__icontains=q)
else:
   results = Person.objects.all()  

context = dict(results=results, q=q)
return render(request, "results.html", context)

models.py

from django.db import models
from django.db import connection

class Person(models.Model):
name = models.TextField()
job = models.TextField()
website = models.TextField()

def __unicode__(self):
    return self.name

urls.py

from django.conf.urls import patterns, include, url
from django.views.generic import ListView, DetailView
from search.models import Person

urlpatterns = patterns('',
    url(r'^$', ListView.as_view(
        queryset=Person.objects.all(),
        template_name="search.html")),

    url(r'^(?P<pk>\d+)/$', DetailView.as_view(
        model=Person,
        template_name="single.html")),

    url(r'^results/$', 'search.views.search'),
)

结果摘要

{% for person in results %}
<li class="list-group-item"><a href="/search/{{person.id}}">{{ person.title }}</a></li>
{% endfor %}

它有效,但我发现我需要将一些文本更改为通配符,因此我需要转到SQL路由。这是不同的代码:

views.py

from django.shortcuts import render
from models import Person
import re
from django.template.loader import get_template 
from django.template import Context
from django.http import HttpResponse
from django.db import connection

def search(request):
q = request.GET.get("q")
moddedq = re.sub(r"(\s\d\s)","%",q)

cursor = connection.cursor()
cursor.execute('''SELECT * FROM search_person WHERE name LIKE %s''', [moddedq])
row = cursor.fetchone()


context = dict(results=results, q=q, moddedq=moddedq, row=row)
return render(request, "results.html", context)

结果摘要

{% for person in row %}
<li class="list-group-item"><a href="/search/{{person.id}}">{{ person.title }}</a></li>
{% endfor %}

然而,这只会创建一个包含人员信息的每个部分的列表,而初始代码只显示名称,并且在点击名称时可以获得额外信息。我注意到没有从SQL中提取ID,因此我尝试创建的超链接只会返回到搜索页面。我的两个主要问题是:

ID未被拉动 所有用户信息都显示在列表中

非常感谢任何帮助。

由于

1 个答案:

答案 0 :(得分:0)

fetchone()返回tuple,而不是

{% for person in row %}
<li class="list-group-item"><a href="/search/{{ person.0 }}">{{ person.1 }}</a></li>
{% endfor %}