如何从django查询集创建新记录

时间:2018-01-23 10:39:17

标签: python django orm

我听说过django orm hack。它就像这样

dp = SomeModel.objects.filter(type="customer").last()
dp.id = dp.id + 1 #changing id to a new one
dp.save() 

如果使用的id值不存在,最后一步应该会创建一个新记录。如果存在递增的id,则save方法的作用类似于update方法。 例如::

dp.version += 1 #updating some random field
dp.save() # will change the newer version of dp.id

我想向django的退伍军人提出两个问题,为了我们的利益,

  1. 使用最新的auto_increment_pk而非pk + 1方法从旧记录创建新记录是否有确定的方法
  2. 上述方法是更快还是更好。我看到的一个优点是,如果我有一个包含10个字段的模型,并且我想要从旧版本创建一个新记录,只需要从旧版本中进行1或2次更改,此方法可以节省8行代码。
  3. 谢谢

3 个答案:

答案 0 :(得分:3)

是的,将id设为无。

dp = SomeModel.objects.filter(type="customer").last()
dp.id = None
dp.save()

答案 1 :(得分:2)

您应该将其设置为None,而不是递增pk。然后它将始终保存为新记录。

答案 2 :(得分:2)

last()返回关于QuerySet的排序的最后一个实例。此实例不保证使用最大的pk。如果确实如此,则无法保证在检索旧的最高pk和使用pk + 1提交新实例之间不会创建其他实例。这样的实例将被新克隆覆盖。因此,不要手动设置新的pk,而是让数据库处理它。正如其他人所建议的那样,通过将pk设置为None

可以轻松完成
instance.pk = None
instance.save()