1

我正在使用带有 MySQL 后端的 Django 1.8。我需要从数据库中的几个表中获取两列并将它们连接起来,然后将排序后的结果放在网页上。到目前为止我有这个:

视图.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。

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

4

2 回答 2

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是其中一个字典。到现在为止还挺好。那么问题来了:

' '.join(q.values())

字典没有排序。所以这将加入所有值,但顺序是任意的。即使是您认为正在工作的那些桌子也会在以后随机损坏。

那么如何解决呢?好吧,就像你做的那样,使用values_list返回的元组,它们是有序的。另一种选择是不依赖顺序,而是使用字典,即通过键寻址:

species = '%s %s' % (q[genus], q[species])

顺便说一句,对于这样一个简单的情况,您可能想要使用列表推导。整个循环可以这样写:

valuesList = ['%s %s' % (q[genus], q[species]) for q in query]
于 2015-07-01T01:36:04.593 回答
0

正如文档所拥有的那样,不是返回字典(对于那个表来说是从前到后),而是有一个返回值列表的选项。结果是正确的,因此 queryBuilder() 函数的工作方式如下:

视图.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)

我仍然不知道为什么上一个查询对于那个烦人的表来说是错误的。

于 2015-07-01T00:01:51.137 回答