Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 运行django更新,但调用save方法_Python_Django - Fatal编程技术网

Python 运行django更新,但调用save方法

Python 运行django更新,但调用save方法,python,django,Python,Django,有没有办法做到以下几点: asset, _ = Asset.objects.get_or_create(system=item['system'], system_table=item['system_table'], ...) Asset.objects.filter(pk=asset.pk).update(**item) 并调用.save()方法?我想我在某个地方读到过,您可以在实际实例上运行更新,而不必通过对象管理器。那怎么办?目前我正在做以下工作,这是非常重复和低效的: a = Ass

有没有办法做到以下几点:

asset, _ = Asset.objects.get_or_create(system=item['system'], system_table=item['system_table'], ...)
Asset.objects.filter(pk=asset.pk).update(**item)
并调用
.save()
方法?我想我在某个地方读到过,您可以在实际实例上运行更新,而不必通过
对象
管理器。那怎么办?目前我正在做以下工作,这是非常重复和低效的:

a = Asset.objects.filter(pk=asset.pk).update(**item)
a.save()

最好的方法是直接调用
save()
。不过,您需要调用
get()
,而不是
filter()

Asset.objects.get(pk=asset.pk).save(update_fields=item)
这不是问题,因为您现有的
filter()
保证返回最多包含一个
资产的查询集。您只需确保给定的
pk
实际存在,或将
get()
调用包装在
try…块中,但
块除外

但是…由于您已经在
资产
中拥有
资产
实例,因此没有理由浪费时间进行DB查询。直接在您拥有的对象上调用
save

asset.save(update_fields=item)

由于您已经拥有了
资产
对象,因此可以直接使用它

#假设在'Asset'变量中有一个'Asset'对象
项={“foo”:“foo值”}
对于字段,项中的值。项()
setattr(资产、字段、名称)
asset.save()
您还可以将
save()
方法的
update\u字段
参数指定为

asset.save(update_fields=list(item.keys()))

asset.save(update\u fields=list(item.keys())
为什么要调用
save()
方法
.update()
执行数据库查询,不会触发任何信号。为什么不迭代查询集并为每个结果调用
.save()
?@IainShelvington我在
save
方法中有特殊的代码,每当对象更新时(即使是通过
update(…)
)我都需要触发它。如果您已经拥有
资产
对象,为什么要调用
filter()
?在这里使用get\u或\u create是没有意义的,因为你可以在这里使用insteadWell。出于安全原因,我强烈建议至少将LTS版本转换为2.2。更新\u或\u create可从版本1.7获得,该版本已有6年历史。这解决了我的问题。我不知道你可以将类似的kwargs传递到
保存
方法。@David542您可以将带有
**
语法的kwargs传递给任何python方法。这不是Django的事情。@code学徒将相关字段,即“模型字段”传递给
save()
方法不会像您那样工作。save(a=5,b=4)您正在传递kwargs(关键字参数)@JPG我的错。我以为您是OP。