假設我有這個由last_name字串欄位組成的Person類。
我想顯示db 中存在的所有名稱首字母的鏈接。
例如:
A B D E...當有 Adams、Brown、Douglas、Evans 并且沒有last_name以 C 開頭的人時。
當然,這里的視圖不是問題,因為我想在后端準備所有這些。所以問題是如何撰寫好的模型或視圖函式來提供這個。
我希望它獨立于資料庫,但是任何特定資料庫的技巧都會是一個獎勵。
另外,我希望它在速度方面得到很好的優化,因為它可能有很多名字。它應該比這個最簡單的演算法更簡單:
- 讓所有人
- 創建首字母的集合(由于元素的唯一性)
- 排序并回傳
例如(在views.py中):
names = Person.objects.values_list('last_name', flat=True)
letters = {name[0] for name in names}
letters_sorted = sorted(letters)
當然,我可以先order_by或為每個物件(包含第一個字母)分配新屬性,但我認為這不會加快行程。
我還認為假設所有字母都在使用中是一個不好的假設,如果我會檢查每個字母,如果該字母至少存在一個名稱;-)
哪種方法對這里的資料庫和 django 最有效?
uj5u.com熱心網友回復:
我將首先對名稱進行排序,然后將名稱解壓縮為 的引數zip,然后僅使用zip產生的第一個元組:
names = sorted(Person.objects.values_list('last_name', flat=True))
first_letters = next(zip(*names))
這不使用集合或洗掉重復項或類似的東西。這很關鍵嗎?如果是,你可以這樣做:
names = Person.objects.values_list('last_name', flat=True)
first_letters = sorted(set(next(zip(*names))))
雖然這幾乎不會比你已經寫的更好。
uj5u.com熱心網友回復:
import string
alphabet_list = list(string.ascii_lowercase) list(string.ascii_uppercase)
result = dict(map(lambda x: (x, Person.objects.filter(name__start_with=x).exists()), alphabet_list))
uj5u.com熱心網友回復:
您還可以使用 orm 方法生成首字母串列(包括計數):
from django.db.models import Count
from django.db.models.functions import Left
initials = (Person
.objects
.annotate(initial=Left('last_name', 1))
.values('initial')
.annotate(count=Count('initial'))
.order_by('initial'))
這將導致類似
<QuerySet [{'initial': 'A', 'count': 1},
{'initial': 'B', 'count': 2},
...
{'initial': 'Y', 'count': 1}]>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/441438.html
標籤:Python django 数据库 PostgreSQL sqlite
上一篇:如何在OracleSQL資料庫中“隱藏”一行但不洗掉它
下一篇:按鍵合并字典
