我正在使用带有MySQL后端的Django 1.8。我需要从数据库中的几个表中获取两列并将它们连接起来,然后将排序后的结果放在网页上。到目前为止我有这个:
views.py
def herps(request):
#performs queries to get distinct species from the database
trQuery = queryBuilder(HetrRec, '_hetr')
opQuery = queryBuilder(HeopRec, '_heop')
valList = opQuery + trQuery
query = sorted(set(valList))
return render_to_response('herps.html', {'queries': query,})
在数据库上执行查询的功能如下所示:
def queryBuilder(table, column_str):
genus = 'genus' + column_str
species = 'species' + column_str
filterSp = {species: 'sp.'}
query = table.objects.order_by(species, genus).values(genus, species).distinct().exclude(**filterSp)
valueList = []
for q in query:
species = ' '.join(q.values())
valueList.append(species)
return(valueList)
因此,输出在Genus Species的几个表组合中出现。在一张表中,它出现了Species Genus。
我已经通过数据删除了可能影响它的任何字符(前导/尾随空格,不完整的对等)但没有快乐。
答案 0 :(得分:2)
我会将代码缩短到非常可能出现问题的特定部分:
query = table.objects.values(genus, species)
valueList = []
for q in query:
species = ' '.join(q.values())
valueList.append(species)
正如您在文档中所读到的,values()
将返回一个字典列表,如下所示:
[{'genus_hetr': 'foogenus', 'species_hetr': 'foospecie'},
{'genus_hetr': 'bargenus', 'species_hetr': 'barspecie'}]
然后,您将遍历该列表。在每次迭代中,q
是一个dicionaries。到现在为止还挺好。然后,问题:
' '.join(q.values())
字典没有排序。所以这将加入所有值,但是以任意顺序。即使那些你认为正在工作的桌子也会在以后随意破坏。
那么如何解决这个问题呢?好吧,就像你一样,使用values_list
返回有序的元组。另一种选择是不依赖于订单,而是使用字典,即通过密钥解决它:
species = '%s %s' % (q[genus], q[species])
顺便说一句,对于这样一个简单的案例,你可能想要使用列表理解。整个循环可以这样写:
valuesList = ['%s %s' % (q[genus], q[species]) for q in query]
答案 1 :(得分:0)
正如文档所拥有的那样,有一个返回值列表的选项,而不是返回一个字典(那是一个表的前面的字典)。这是正确的方式,所以queryBuilder()函数的工作方式如下:
<强> views.py 强>
def queryBuilder(table, column_str):
genus = 'genus_' + column_str
species = 'species_' + column_str
filterSp = {species: 'sp.'}
query = table.objects.values_list(genus, species).distinct().exclude(**filterSp)
valueList = []
for q in sorted(query):
species = ' '.join(q)
valueList.append(species)
return(valueList)
我仍然不知道为什么之前的查询出现了错误的方法,因为那张桌子很烦人。