我需要查询特定模型的一组对象,更改单个属性/列(“帐户”),然后将整个查询集的对象保存为新对象/行。换句话说,我想复制对象,并在重复项上更改单个属性(“帐户”)。我基本上是创建一个新帐户,然后检查每个模型并将以前帐户的对象复制到新帐户,因此我将使用不同的模型重复执行此操作,可能使用 django shell。我应该如何处理这个问题?可以在查询集级别完成还是需要循环遍历所有对象?
i.e.,
MyModel.objects.filter(account="acct_1")
# Now I need to set account = "acct_2" for the entire queryset,
# and save as new rows in the database
来自docs https://docs.djangoproject.com/en/1.4/ref/models/instances/#how-django-knows-to-update-vs-insert:
如果对象的主键属性未设置,或者设置了但
记录不存在,Django 执行 INSERT。
所以如果你设置id
or pk
到 None 它应该有效,但我在 SO 上看到了对此解决方案的相互矛盾的反应:在 Django 中复制模型实例及其相关对象/递归复制对象的算法 https://stackoverflow.com/questions/437166/duplicating-model-instances-and-their-related-objects-in-django-algorithm-for
这个解决方案应该有效(感谢@JoshSmeaton 的修复):
models = MyModel.objects.filter(account="acct_1")
for model in models:
model.id = None
model.account = "acct_2"
model.save()
我认为就我而言,我有一个OneToOneField
在我正在测试的模型上,因此我的测试不适用于这个基本解决方案是有道理的。但是,我相信它应该有效,只要你照顾 OneToOneField 的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)