我有一个对象:-
a = Model.objects.get(id=1)
以及对象a的数据属性的字典。
a
update_data = { colA: 1, colB: 2, colC: 3, }
现在,我想更新对象a。我该怎么做?注意:-.update()作用于查询集,而不是对象。另外,我不能执行a.colA=1,因为在这种情况下,我在每个键上都使用了setattr。有没有办法直接更新对象?
.update()
a.colA=1
setattr
gk7wooem1#
你可以像这样使用.update()方法:
Model.objects.filter(id=1).update(**update_data)
或者你也可以更新单个对象(在update_data dict中迭代):
update_data
a = Model.objects.get(id=1) for name in update_data: setattr(a, name, update_data[name]) # don't forget to save the object after modifying a.save()
gzszwxb42#
我觉得你可以
a = Model.object.get(id=1) a.__dict__.update(update_data)
a0x5cqrl3#
对于直接更新,考虑到字典已经构建,您可以首先过滤对象,然后轻松更新数据,而且filter()比get()更快(* 我已经在小数据库大小上测试过)正如你在评论中所说,如果你只有对象(模型示例)和字典,你可以这样写:
filter()
get()
Model.objects.filter(id=a.id).update(**update_data)
性能结果(在小数据库大小上测试)在[4]中:g = Genres.objects.last()
In [6]: %timeit Genres.objects.get(id=g.id) 518 µs ± 10.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) In [7]: %timeit Genres.objects.filter(id=g.id) 74.2 µs ± 807 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
3条答案
按热度按时间gk7wooem1#
你可以像这样使用
.update()
方法:或者你也可以更新单个对象(在
update_data
dict中迭代):gzszwxb42#
我觉得你可以
a0x5cqrl3#
对于直接更新,考虑到字典已经构建,您可以首先过滤对象,然后轻松更新数据,而且
filter()
比get()
更快(* 我已经在小数据库大小上测试过)正如你在评论中所说,如果你只有对象(模型示例)和字典,你可以这样写:
性能结果(在小数据库大小上测试)在[4]中:g = Genres.objects.last()