queryset.update不适用于for循环

时间:2017-12-06 06:27:50

标签: django django-admin-actions

如果匹配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') os不在这里工作。

有人可以帮我了解正确的声明,根据if else条件更新数据库。

3 个答案:

答案 0 :(得分:1)

更新查询在查询集上完成。它不是像你想要的那样在一个对象上完成的。你可以简单地做

queryset.filter(name='abc').update(name='zzz')

答案 1 :(得分:0)

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")

答案 2 :(得分:0)

您无法使用更新查询更新单个对象。可以使用update更新查询集中的对象。请参阅文档以获得澄清:Django Update query

在你的情况下。你可以这样做:

queryset.filter(name='abc').update(name='zzz')

而不是for-loop。

OR

for pri in queryset:
    if pri.name == 'abc':        # loop is matching the condition
        pri.name='zzz'
        pri.save() # save the updated value

如果您的模型附有信号,则会出现这种情况。 Update查询实际上并不使用django save,因此不会发出pre_save,post_save信号。