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.

Другие вопросы по тегам