update_or_create只在循环中更新/在数据库中创建一行

时间:2016-06-05 19:09:38

标签: python django

这是我的设置模型...基本上我将设置存储为多行键值对

class Settings(models.Model):
    key = models.CharField(max_length=50 , default=''  ,unique=True )
    value = models.TextField(default='')

所以当我想要保存设置时,我想为每个键更新或创建一行 (如果密钥已经存在,则更新它的值,如果不创建具有给定密钥值的新行)

所以这是我的观看代码

    jsetting = request.POST.get('jsetting' , None)
    if(jsetting is not None):
        setting  = json.loads(jsetting)
        for k,v in dict.items(setting):
            print(str(k) +' -> '+ str(v))
            Settings.objects.update_or_create({'key':k , 'value':v})

问题是目前它只保存或更新设置字典中的最后一项......所以当它完成循环时,我在数据库中只有1行!

我试图在循环中创建Setting的新实例

        for k,v in dict.items(setting):
            s = Settings()
            s.objects.update_or_create({'key':k , 'value':v})

但显然我无法做到这一点我得到了这个错误

Manager isn't accessible via Settings instances

2 个答案:

答案 0 :(得分:1)

我没有使用update_or_create,但根据the docs,除了要更新的值之外,似乎必须使用一个或多个关键字参数来获取或创建对象。 / p>

所以这可行:

Settings.objects.update_or_create(key=k, defaults={'value':v})

答案 1 :(得分:1)

来自update_or_create的文档:

update_or_create(defaults=None, **kwargs)
     

使用给定kwargs更新对象的便捷方法,必要时创建一个新对象。 defaults是用于更新对象的(field, value)对字典。

因此:

kwargs    - includes the fields which should be used to find if any such row exists in the table
defaults  - includes the fields whose values should be updated.

在您的情况下,您需要查找是否存在包含key字段的现有行,然后更新相应的value字段:

kwargs = {'key': k}          # you need to search using key
defaults = {'value': v}       # you need to update the value

Settings.objects.update_or_create(defaults=defaults, **kwargs)

或者,在一行中:

Settings.objects.update_or_create(defaults={'value': v}, key=k)