W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
當(dāng)你只想得到字典或列表的值,并且不需要 ?ORM
?模型對(duì)象時(shí),可以適當(dāng)使用 ?values()
? 。這些對(duì)于替換模板代碼中的模型對(duì)象非常有用——只要你提供的字典具有與模板中使用時(shí)相同的屬性就行。
如果你明確不需要這個(gè)數(shù)據(jù)庫(kù)列(或在大部分情況里不需要),使用 ?defer()
? 和 ?only()
? 來避免加載它們。注意如果你使用它們,?ORM
?將必須在單獨(dú)的查詢中獲取它們,如果你不恰當(dāng)?shù)氖褂?,?huì)讓事情變得糟糕。
不要在沒有分析的情況下過分使用延遲字段,因?yàn)閿?shù)據(jù)庫(kù)必須從磁盤中讀取結(jié)果中單行的大部分非文本、非VARCHAR數(shù)據(jù),即使它最終只使用的幾列。當(dāng)你不想加載許多文本數(shù)據(jù)或需要大量處理來轉(zhuǎn)換回 Python的字段, ?defer()
? 和 ?only()
? 方法最有用。總之,先分析,再優(yōu)化。
如果您只想找出 obj 是否在查詢集中,而不是 obj 在查詢集中。
如果你只想計(jì)數(shù),不要使用 ?len(queryset)
?。
若你只想要確認(rèn)是否有至少存在一項(xiàng)滿足條件的結(jié)果,而不是? if queryset
?。
如果你需要查詢集中的其他數(shù)據(jù),請(qǐng)立即對(duì)其進(jìn)行評(píng)估。
假設(shè) Group 模型與 User 具有多對(duì)多關(guān)系,則以下代碼是最佳的:
members = group.members.all()
if display_group_members:
if members:
if current_user in members:
print("You and", len(members) - 1, "other users are members of this group.")
else:
print("There are", len(members), "members in this group.")
for member in members:
print(member.username)
else:
print("There are no members in this group.")
這是最佳的,因?yàn)椋?br>
QuerySet
?是惰性的,因此如果 ?display_group_members
? 為 ?False
?,則不會(huì)進(jìn)行數(shù)據(jù)庫(kù)查詢。group.members.all()
? 存儲(chǔ)在 ?members
?變量中可以重用其結(jié)果緩存。if members
?: 導(dǎo)致 ?QuerySet.__bool__()
? 被調(diào)用,這導(dǎo)致 ?group.members.all()
? 查詢?cè)跀?shù)據(jù)庫(kù)上運(yùn)行。 如果沒有任何結(jié)果,它將返回 ?False
?,否則返回 ?True
?。if current_user in members
?:檢查用戶是否在結(jié)果緩存中,因此不會(huì)發(fā)出額外的數(shù)據(jù)庫(kù)查詢。len(members)
? 的使用調(diào)用了 ?QuerySet.__len__()
?,重用了結(jié)果緩存,因此再次沒有發(fā)出數(shù)據(jù)庫(kù)查詢。for member
?循環(huán)遍歷結(jié)果緩存。如果要設(shè)置一些值并單獨(dú)保存它們,而不是檢索對(duì)象,那么可以通過 ?QuerySet.update()
? 使用批量 SQL ?UPDATE
?語(yǔ)句。類似地,盡可能使用批量刪除( ?bulk deletes
? )。
注意,盡管這些批量更新方法不會(huì)調(diào)用單獨(dú)實(shí)例的 ?save()
? 或 ?delete()
? 方法,這意味著你為這些方法添加的任何自定義行為都不會(huì)執(zhí)行,包括來自正常數(shù)據(jù)庫(kù)對(duì)象信號(hào)( ?signals
? )的任何內(nèi)容。
如果只需要外鍵值,那么使用已有對(duì)象上的外鍵值,而不是獲取所有相關(guān)對(duì)象并獲取它的主鍵。比如:
entry.blog_id
替換成:
entry.blog.id
排序是耗時(shí)的;對(duì)每個(gè)字段的排序是數(shù)據(jù)庫(kù)必須執(zhí)行的操作。如果模型有一個(gè)默認(rèn)排序( ?Meta.ordering
? )并且不需要它,那么可以通過調(diào)用沒有參數(shù)的 ?order_by()
? 在查詢集上刪除它。
添加索引到你的數(shù)據(jù)庫(kù)上可以幫助改進(jìn)排序性能。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: