如何传递包含字段的dict来更新Django模型? 这不是创建对象,而是更新它。
示例:
obj = Object.objects.create(index=id, **fields)
答案 0 :(得分:26)
只要PK相同,现有行就会被覆盖。
obj = Object(index=id, **fields)
obj.save()
答案 1 :(得分:14)
def update_object(obj, **kwargs):
for k, v in kwargs.items():
setattr(obj, k, v)
obj.save()
答案 2 :(得分:8)
您可以获取一个对象的查询集,然后更新它:
model = Model.objects.filter(pk=pk)
model.update(**kwargs)
但是,这不会调用对象上的.save()方法。不过,我认为它只会进行一次数据库查询。
请注意,如果您没有过滤到一个对象(即查询得到多个对象:例如,如果您没有查询PK),它将更新所有对象。如果它过滤为none,则不会将任何内容写入数据库。
话虽如此,我还没有意识到Ignacio的解决方案。我很喜欢。
答案 3 :(得分:4)
如果您知道要创建它:
Book.objects.create(**fields)
假设您需要检查现有实例,可以使用get或create:
找到它instance, created = Book.objects.get_or_create(slug=slug, defaults=fields)
if not created:
for attr, value in fields.iteritems():
setattr(instance, attr, value)
instance.save()
正如在另一个答案中所提到的,你也可以使用查询集管理器上的update
函数,但我相信它不会发出任何信号(如果你不使用它们可能对你不重要) 。但是,您可能不应该使用它来更改单个对象:
Book.objects.filter(id=id).update(**fields)
答案 4 :(得分:4)
这个问题有点陈旧,但只是为了更新最近的Django开发 - 从1.7开始,update_or_create
方法在查询集上的工作方式与get_or_create
类似。
在这种情况下,它可以像:
一样使用obj, created = Object.objects.update_or_create(index=id, defaults=fields)
答案 5 :(得分:0)
您可以在filter()
查询之后简单地使用方法更新
obj = Object.objects.filter(index=id).update(**fields) # fields your object(dict) may be **kwargs
如果是.get()方法,
obj = Object.objects.get(index=id)
obj['key1'] = 'value1'
obj.save()