如何使用字典更新Django模型字段?

99 投票
7 回答
69220 浏览
提问于 2025-04-16 14:50

假设我有一个这样的模型:

class Book(models.Model):
    num_pages = ...
    author = ...
    date = ...

我可以创建一个字典,然后用它来插入或更新这个模型吗?

d = {"num_pages":40, author:"Jack", date:"3324"}

7 个回答

77

如果你知道自己想要创建它:

Book.objects.create(**d)

假设你需要检查是否已经存在一个实例,你可以用获取或创建的方法:

instance, created = Book.objects.get_or_create(slug=slug, defaults=d)
if not created:
    for attr, value in d.items(): 
        setattr(instance, attr, value)
    instance.save()

正如另一个回答中提到的,你也可以在查询集管理器上使用 update 函数,但我认为这样不会发送任何信号(如果你不使用信号,这可能对你来说没什么关系)。不过,你可能不应该用它来修改单个对象:

Book.objects.filter(id=id).update()
96

使用 ** 来创建一个新的模型。遍历字典,然后使用 setattr() 来更新一个已经存在的模型。

出自 Tom Christie 的 Django Rest Framework

https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/serializers.py

for attr, value in validated_data.items():
    setattr(instance, attr, value)
instance.save()
131

这里有一个使用你字典 d 创建的例子:

Book.objects.create(**d)

要更新一个已经存在的模型,你需要使用 QuerySet 的 filter 方法。假设你知道想要更新的书籍的 pk(主键):

Book.objects.filter(pk=pk).update(**d)

撰写回答