Python正在向后打印一个列表而不是其他列表

时间:2015-06-29 20:19:54

标签: python mysql django django-1.8

我正在使用带有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。

我已经通过数据删除了可能影响它的任何字符(前导/尾随空格,不完整的对等)但没有快乐。

2 个答案:

答案 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)

我仍然不知道为什么之前的查询出现了错误的方法,因为那张桌子很烦人。