W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
有時候,你想統(tǒng)一設(shè)置 ?QuerySet
?中的所有對象的某個字段。你可以通過 ?update()
? 達(dá)到目的。例如:
# Update all the headlines with pub_date in 2007.
Entry.objects.filter(pub_date__year=2007).update(headline='Everything is the same')
你僅能用此方法設(shè)置非關(guān)聯(lián)字段和 ?ForeignKey
?字段。要修改非關(guān)聯(lián)字段,需要用常量提供新值。要修改 ?ForeignKey
?字段,將新值置為目標(biāo)模型的新實例。例如:
>>> b = Blog.objects.get(pk=1)
# Change every Entry so that it belongs to this Blog.
>>> Entry.objects.all().update(blog=b)
方法 ?update()
? 立刻被運(yùn)行,并返回匹配查詢調(diào)節(jié)的行數(shù)(若某些行早已是新值,則可能不等于實際匹配的行數(shù))。更新 ?QuerySet
?的唯一限制即它只能操作一個數(shù)據(jù)表:該模型的主表。你可以基于關(guān)聯(lián)字段進(jìn)行篩選,但你只能更新模型主表中的列。例如:
>>> b = Blog.objects.get(pk=1)
# Update all the headlines belonging to this Blog.
>>> Entry.objects.filter(blog=b).update(headline='Everything is the same')
?update()
? 方法是直接轉(zhuǎn)為 SQL 語句的。這是一種用于直接更新的批量操作。它并不會調(diào)用模型的 ?save()
? 方法,也不會發(fā)出 ?pre_save
? 或 ?post_save
? 信號(這是調(diào)用 ?save()
? 的結(jié)果),或使用 ?auto_now
? 字段選項。若想保存 ?QuerySet
?中的每項,并確保調(diào)用了每個實例的 ?save()
? 方法,你并不需要任何特殊的函數(shù)來處理此問題。迭代它們,并調(diào)用它們的 ?save()
? 方法:
for item in my_queryset:
item.save()
調(diào)用更新方法時也能使用 ?F
? 表達(dá)式 基于同一模型另一個字段的值更新某個字段。這在基于計數(shù)器的當(dāng)前值增加其值時特別有用。例如,要增加博客中每個條目 ?pingback
?的計數(shù):
>>> Entry.objects.all().update(number_of_pingbacks=F('number_of_pingbacks') + 1)
然而,與過濾器中的 ?F()
對象和排除字句不同,你不能在更新方法中使用 ?F()
? 對象的同時使用 ?join
?——你只能引用被更新模型的內(nèi)部字段。若你試著在使用 ?join
?字句時使用 ?F()
? 對象,會拋出一個 ?FieldError()
?:
# This will raise a FieldError
>>> Entry.objects.update(headline=F('blog__name'))
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: