我正在使用MySQL和Django,无法查看从我的模型管理器中执行的查询返回的数据。
页面使用表格进行渲染,边框和分页工作正常,但是,表格中没有出现任何字段值。
我猜测返回查询结果并在html中显示它之间需要一步但是我很难过。
对于上下文,我正在设置我的经理,因此我可以执行比Django提供的更复杂的查询。
我按照一些示例使用模型管理器作为开始使用相当简单的查询 - ..我在本网站之外研究过的众多参考文献之一:https://docs.djangoproject.com/en/dev/topics/db/managers/#custom-managers
花了很多时间搜索后,我相信这里有人可以提供帮助。提前致谢!!
以下是模特经理:
class ElectionsManager(models.Manager):
def is_active(self):
from django.db import connection
cursor = connection.cursor()
cursor.execute("""
SELECT *
FROM
newvoterproject.fullvh vh1
WHERE
vh1.city = 'Glocester' and
vh1.current_party = 'd'
group by
vh1.city,
vh1.street_name,
vh1.street_name_2,
vh1.street_number,
vh1.unit
;""")
result_list = cursor.fetchall()
return result_list
这里有一个模型片段:
class Election(models.Model):
voter_id = models.CharField(primary_key=True, max_length=25)
last_name = models.CharField(max_length=50, blank=True, null=True)
first_name = models.CharField(max_length=50, blank=True, null=True)
middle_name = models.CharField(max_length=50, blank=True, null=True)
current_party = models.CharField(max_length=50, blank=True, null=True)
street_number = models.CharField(max_length=50, blank=True, null=True)
street_name = models.CharField(max_length=50, blank=True, null=True)
street_name_2 = models.CharField(max_length=50, blank=True, null=True)
unit = models.CharField(max_length=50, blank=True, null=True)
city = models.CharField(max_length=50, blank=True, null=True)
state = models.CharField(max_length=50, blank=True, null=True)
zip_code = models.CharField(max_length=50, blank=True, null=True)
zip_code_4 = models.CharField(max_length=50, blank=True, null=True)
precinct = models.CharField(max_length=50, blank=True, null=True)
status = models.CharField(max_length=50, blank=True, null=True)
objects = ElectionsManager() # model manager
class Meta:
managed = False
verbose_name = 'Election'
verbose_name_plural = 'Elections'
db_table = 'fullvh'
def __str__(self):
return '%s %s' % (self.first_name, self.last_name)
从视图中调用模型管理器:
def vhistfun(request):
election_table = Election.objects.is_active()
paginator = Paginator(election_table , 25) # Show 25 contacts per page - may want to change this to READ 25 at a time...
page = request.GET.get('page')
try:
electpage = paginator.page(page)
except PageNotAnInteger:
electpage = paginator.page(1)
except EmptyPage:
electpage = paginator.page(paginator.num_pages)
context = {'electpage': electpage,
}
return render(request, 'elections/electable.html', context)
..和html snip处理结果
{% for elect in electpage %}
<tr id="voterrowclass" class="">
<td> {{ elect.first_name|lower|capfirst }} </td>
<td> {{ elect.last_name|lower|capfirst }} </td>
<td> {{ elect.current_party}} </td>
<td> {{ elect.street_number}} {{ elect.unit}} </td>
<td> {{ elect.street_name|lower|capfirst}} {{ elect.street_name_2|lower|capfirst}} </td>
<td> {{ elect.city|lower|capfirst}} </td>
</tr> <!-- # model data sent from view -->
{% endfor %}
答案 0 :(得分:0)
您的自定义管理器方法未返回Election对象;它返回表示数据库行的元组。因此,您无法通过字段名称在模板中引用结果,就像它们是对象一样。
真的,这不是经理人的意思;您的经理方法应始终返回查询集。
答案 1 :(得分:0)
感谢您的见解。
我做了一些更改并让它工作但没有使用模型管理器(现在)。
以下是增强视图,让事情有效:
def vhistfun(request):
election_table = Election.objects.raw("""
SELECT *
FROM
newvoterproject.fullvh vh1
WHERE
vh1.city = 'Glocester'
AND (vh1.current_party = 'r' or vh1.current_party = 'u')
GROUP BY vh1.city ,
vh1.street_name ,
CONVERT(SUBSTRING_INDEX(vh1.street_number,'-',-1),UNSIGNED INTEGER) ,
vh1.unit
;
""")
party_list=('r','u')
town_list=('Glocester')
query_information ='Voters in the 2012 Presidential Election (election_3) and either the 2008 Presidential Election (election_8)or the 2012 Presidential Primary (election_5)'
paginator = Paginator(list(election_table), 10) # NOTE > this was changed from paginator = Paginator(election_table , 25)
page = request.GET.get('page')
try:
electpage = paginator.page(page)
except PageNotAnInteger:
electpage = paginator.page(1)
except EmptyPage:
electpage = paginator.page(paginator.num_pages)
context = {'electpage': electpage,
'party_list': party_list,
'town_list': town_list,
'query_information ': query_information
}
return render(request, 'elections/electable.html', context)
只是注意/警告 - 使用objects.raw会导致此问题与分页:
object of type 'int' has no len()
我在这里找到了解决方法:Django paginator and raw SQL
现在我正在使用数据填充我的表格,并将继续进行我的项目所需的更高级查询....
我暂时没有回答这个问题。 虽然我成功获取了我需要使用raw的数据,但它没有解决问题 - 为什么模型管理器中的查询没有正确地在html上显示数据......