如何使用字典更新Django模型字段?
假设我有一个这样的模型:
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)