前端用户在此处给出类似[[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
答案 0 :(得分:0)
在更新之前,应首先保存所有PVariant
对象(调用save
方法)。
像这样:
variants = []
for param in params:
inst = PVariant(display_name=param[0],sku=param[1], quantity=param[2], weight=param[3], product=product)
inst.save()
variants.append(inst)
答案 1 :(得分:0)
这可以通过两个查询来实现,而无需考虑需要更新的变体数量。
您只需要在客户端正确索引数据,即可确定将哪些更新应用于哪个现场服务器端。
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]