W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
有時(shí)候,你想統(tǒng)一設(shè)置 ?QuerySet
?中的所有對(duì)象的某個(gè)字段。你可以通過(guò) ?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)模型的新實(shí)例。例如:
>>> 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í)際匹配的行數(shù))。更新 ?QuerySet
?的唯一限制即它只能操作一個(gè)數(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 語(yǔ)句的。這是一種用于直接更新的批量操作。它并不會(huì)調(diào)用模型的 ?save()
? 方法,也不會(huì)發(fā)出 ?pre_save
? 或 ?post_save
? 信號(hào)(這是調(diào)用 ?save()
? 的結(jié)果),或使用 ?auto_now
? 字段選項(xiàng)。若想保存 ?QuerySet
?中的每項(xiàng),并確保調(diào)用了每個(gè)實(shí)例的 ?save()
? 方法,你并不需要任何特殊的函數(shù)來(lái)處理此問(wèn)題。迭代它們,并調(diào)用它們的 ?save()
? 方法:
for item in my_queryset:
item.save()
調(diào)用更新方法時(shí)也能使用 ?F
? 表達(dá)式 基于同一模型另一個(gè)字段的值更新某個(gè)字段。這在基于計(jì)數(shù)器的當(dāng)前值增加其值時(shí)特別有用。例如,要增加博客中每個(gè)條目 ?pingback
?的計(jì)數(shù):
>>> Entry.objects.all().update(number_of_pingbacks=F('number_of_pingbacks') + 1)
然而,與過(guò)濾器中的 ?F()
對(duì)象和排除字句不同,你不能在更新方法中使用 ?F()
? 對(duì)象的同時(shí)使用 ?join
?——你只能引用被更新模型的內(nèi)部字段。若你試著在使用 ?join
?字句時(shí)使用 ?F()
? 對(duì)象,會(huì)拋出一個(gè) ?FieldError()
?:
# This will raise a FieldError
>>> Entry.objects.update(headline=F('blog__name'))
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)系方式:
更多建議: