通过kwargs更新模型django

时间:2010-11-05 17:09:06

标签: python django

如何传递包含字段的dict来更新Django模型? 这不是创建对象,而是更新它。

示例:

obj = Object.objects.create(index=id, **fields)

6 个答案:

答案 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()