queryset.update не работает для цикла for
Я хочу изменить имя для любой переменной базы данных, если ее соответствие abc.
def icall(modeladmin, request, queryset):
for pri in queryset:
print('from test:', pri.name, pri.title) # priting if working fine
if pri.name == 'abc': # loop is matching the condition
pri.update(name='zzz') ## the value is not getting update in DB
else:
print("gg not mached")
pri.update(name='zzz')
здесь не работает
Может кто-нибудь, пожалуйста, помогите мне узнать правильное утверждение для обновления базы данных на основе условия if else.
3 ответа
def icall(modeladmin, request, queryset):
for pri in queryset:
print('from test:', pri.name, pri.title)
if pri.name == 'abc':
pri.name ='zzz'
pri.save()
print("working")
else:
print("gg not mached")
Обновление запроса выполняется в наборе запросов. Это не делается на одном объекте, как вы пытаетесь сделать. Вы можете просто сделать
queryset.filter(name='abc').update(name='zzz')
Вы не можете обновить один объект, используя запрос на обновление. Можно обновить объекты в наборе запросов в целом, используя обновление. Пожалуйста, обратитесь к документу для уточнения: Django Update запрос
В твоем случае. Ты можешь сделать:
queryset.filter(name='abc').update(name='zzz')
вместо цикла.
ИЛИ ЖЕ
for pri in queryset:
if pri.name == 'abc': # loop is matching the condition
pri.name='zzz'
pri.save() # save the updated value
Это в том случае, если к вашим моделям подключены сигналы. Запрос на обновление фактически не использует django save и, следовательно, не генерирует сигналы pre_save, post_save.