django - 如何修改查询集并将其另存为新对象?

标签 django django-queryset

我需要为特定模型查询一组对象,更改单个属性/列(“帐户”),然后将整个查询集的对象保存为新对象/行。换句话说,我想复制对象,并在重复项上更改单个属性(“帐户”)。我基本上是在创建一个新帐户,然后遍历每个模型并将以前帐户的对象复制到新帐户,因此我将使用不同的模型重复执行此操作,可能使用 django shell。我应该如何处理这个问题?可以在查询集级别完成还是需要遍历所有对象?

IE。,

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 :

If the object’s primary key attribute is not set, or if it’s set but a record doesn’t exist, Django executes an INSERT.



所以如果你设置 idpk到 None 它应该工作,但我在 SO 上看到了对此解决方案的相互矛盾的回应:Duplicating model instances and their related objects in Django / Algorithm for recusrively duplicating an object

此解决方案应该有效(感谢@JoshSmeaton 的修复):
models = MyModel.objects.filter(account="acct_1")
for model in models:
  model.id = None
  model.account = "acct_2"
  model.save()

我想就我而言,我有一个 OneToOneField在我正在测试的模型上,所以我的测试不适用于这个基本解决方案是有道理的。但是,我相信它应该有效,只要您照顾好 OneToOneField。

关于django - 如何修改查询集并将其另存为新对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16149871/

相关文章:

python - Django 从 1.7.1 升级到 1.9.2。导入错误 : cannot import name 'importlib'

Django:从 G​​ET 请求生成查询集

mysql - Django:根据相关字段的计数来订购 QuerySet 的最快方法是什么?

python - 对 django 中列表列表的元素进行排名和计数

mysql - Django 按相关模型字段排序查询集

python - css 文件在 Django 应用程序中不起作用

python - 如何永久 "wire"EC2 ip 地址到 virtualenv 中的 django

django - 操作失败: database error: not authorized for query on database.系统.命名空间

python - 如何设置特定长度的特定 faker 随机字符串并使用下划线作为空格?

python - 明确限制 Django QuerySet