2015-06-29 111 views
1

我正在使用帶有MySQL後端的Django 1.8。我需要從數據庫中的多個表中獲取兩列,並將它們連接起來,然後將排序後的結果放在網頁上。我有這個至今:Python正在向後打印一個列表,但不打印其他列表

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) 

所以輸出出來,在幾個表作爲屬種的組合。在一張桌子裏它出來了物種屬。

我已經通過數據刪除任何可能影響它的字符(前導/尾隨空格,不完整的對等),但沒有喜悅。

+0

你正在建立的兩個列表,哪一個是正確的,你認爲哪個是反向的? – blakev

+0

trQuery出來正確,opQuery回到前面。我試着改變對queryBuilder()的調用順序,並使用其他表(包括鏈接多個不同表中的多個查詢)。這只是一個表格與前面的串聯(物種然後是屬,而不是屬,然後物種)一致。 –

回答

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] 
+0

非常感謝。列表的理解工作。比我的摸索更清潔的方法,謝謝你的明確解釋。 –

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) 

我仍然不知道爲什麼前一次查詢出來的錯誤的方式在那張令人討厭的桌子周圍。