Django4.0 執(zhí)行查詢-一次修改多個(gè)對(duì)象

2022-03-16 17:33 更新

有時(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'))


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)