这是我的设置模型...基本上我将设置存储为多行键值对
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
答案 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)