Skip to main content
 首页 » 编程设计

python之如何从 Django 查询集中创建新记录

2025年05月04日32jillzhang

我听说过某个地方的 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 行代码。

谢谢

请您参考如下方法:

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

instance.pk = None 
instance.save()