python - 如何使用 bulk_update 一次更新多个模型对象?
问题描述
这里来自前端用户的输入值是这样的 ['1','2', '3']。我想同时更新多个对象,bulk_update
我尝试过这样,但这给了我这个错误。
ValueError: All bulk_update() objects must have a primary key set.
使用这种类似的方式,我使用可以正常bulk_create
工作但bulk_update
无法正常工作的方法创建对象。
在这里我想一次更新多个具有不同值的模型对象?
class PVariant(models.Model):
name = models.CharField(max_length=255)
product = models.ForeignKey(Product, on_delete=models.CASCADE)
....
#views
quantity = request.POST.getlist('quantity')
#['1','2','3']
names = request.POST.getlist('names')
fields = ['name', 'price', 'quantity'..]
params = zip(names, quantity, weight,..)
variants = [PVariant(name=param[0],sku=param[1], quantity=param[2], weight=param[3],
product=product) for param in params]
PVariant.objects.bulk_update(variants, fields)
编辑: 从客户端,我在视图中获取此类数据。
['name1', 'name2'] names
['12', '1213.0'] field1
['12.0', '12.0'] field2
['1244', '1244'] field3
['11', '11'] field4
['12.0', '12.0'] field5
解决方案
解决方案
无论需要更新的变体数量如何,这都可以在两个查询中实现。
您只需要在客户端正确索引您的数据,以便您可以确定将哪些更新应用于服务器端的哪个字段。
pvs = PVariant.objects.filter(id__in=pvs_indexed_by_id.keys())
for pv in pvs:
data = pvs_indexed_by_id[pv.id]
pv.name = data[“name”]
...
PVariant.objects.bulk_update(pvs, [“name”, ...])
如果您无法修改数据形状客户端,只需在上面的代码之前清理数据:
fields = (“name”, “field1”, ...)
data = {}
for i, field enumerate(request.POST):
data[fields[i]] = field[i]
推荐阅读
- react-router-v4 - 从 Route 组件外部路由
- html - md 和 sm/xs 的列网格的不同布局 - Bootstrap
- python - 如何使用python脚本输入集群密码
- javascript - 在括号内使用点正在破坏 swig 模板
- excel - VBA-MouseMove 打开和关闭另一个用户窗体
- c++ - 将 GLSL 的顶点属性与 LibiGL 结合使用
- r - 在R中将日期格式化为年月
- python - 如何在python中进行具有奇异性的三重积分?
- ios - 使用 itms-apps 的 App Store 链接:用于开发者组合
- c# - 带有自定义 StringComparer 的 IndexOf