当前位置: 首页 > 知识库问答 >
问题:

Django管理员save_model在Postgres中不推进主键

白学
2023-03-14

因此,我在Django admin中有一个函数,允许我在数据库中创建一个重复的<code>MyModel</code>:

def save_model(self, request, obj, form, change):
    if '_saveasnew' in request.POST:
        old_obj_id = resolve(request.path).args[0]
        old_obj = MyModel.objects.get(id=old_obj_id)
        obj.other_id = old_obj.other_id
        obj.status = old_obj.status
        obj.project_id = old_obj.project_id
        obj.test_url = old_obj.test_url
        obj.save()
    super(MyModelAdmin, self).save_model(request, obj, form, change)

这个创建工作很好,但我有另一个与这个数据库交互的系统,每次调用这个函数时都会看到插入失败。例如,如果我以这种方式在Django admin中创建了两个重复条目,那么另一个系统将看到两个错误,如

完整性错误重复的键值违反了唯一约束“my_model_pkey”详细信息:键 (id)=(1234) 已存在。

我正在使用詹戈 1.11.15

共有1个答案

齐阎宝
2023-03-14

我最好的猜测是,您的代码在某个地方告诉您的数据库创建一个新的对象行并显式将该行的ID设置为X。当代码真正告诉您的数据库创建一个新的对象行并隐式设置该行的ID为下一个可用整数。

您的代码令人困惑,因为您正在以非常复杂的方式进行。为什么这个函数同时接受对象和请求?然后它从请求中找到旧对象?新对象是在哪里创建的?

更简单的方法是首先检查是否要保存为新的。如果没有,则使用一个函数更新对象并将其赋予现有对象。如果是另存为新请求,则创建一个新对象行,该行的值与现有对象的值相似(ID除外)。然后用这些变化更新该新对象。或者你的逻辑应该如何工作。在任何情况下,如果您考虑步骤是如何排序的,那么有一种更直接的方法来完成您希望发生的步骤。

 类似资料:
  • 问题内容: 我在Django管理员方面遇到一些问题。 在syncdb之后,结果是: 这是什么意思? 无论如何,当我访问网站管理面板http://www.example.com/admin/时,我收到以下消息: setting.py包含: ur.py包含: 问题答案: 如果你仅从项目中运行一个站点,则实际上并不需要该框架,因此最简单的解决方法是从你的项目中删除以下项目,错误应消失: 你也可以从she

  • 问题内容: 好吧,我的设计很简单。 是否有一种简单的方法允许用户在一页上全部创建更新? 我想要的是用户能够转到管理界面,添加新的更新,然后在编辑更新时添加一个或多个帖子,每个帖子都有一个或多个Media项目。另外,我希望用户能够在更新内重新排列帖子。 我当前的尝试在admin.py中包含以下内容: 这使用户可以添加一个新的Post项,选择相关的Update,向其添加Media项,然后单击Save-

  • 主要内容:启动管理界面Django为管理活动提供随时可以使用的用户界面。 我们都知道,管理界面对于一个Web项目是十分重要的。 Django根据您的项目模型自动生成管理界面。 启动管理界面 管理界面依赖于 django.contrib 模块。若需它工作,需要确保一些模块是否导入在 myproject/settings.py 文件中的INSTALLED_APPS和MIDDLEWARE_CLASSES元组。 对于 INST

  • 管理员可采取逐条新增和批量新增两种方式进行操作。 逐条新增 进入员工页面,点击上方“新增员工”按钮。 •输入员工个人信息 按照指示输入员工信息,其中标注红色*号为必填信息(姓名、手机号、部门)。输入完毕后点击保存。 注:若您尚未创建部门,您可以将员工直接放置在公司下。 •为员工分配用车制度 选择是否允许员工使用企业支付,为其分配用车制度,选择是否需要其填写用车制度以及设置用车限额。设置完毕后点击保

  • 问题内容: 删除了对ModelAdmin方法上allow_tags属性的支持。 问题答案: 刚找到答案,使用功能。 在旧代码中,您可以使用: 在新代码中,应使用:

  • 问题内容: 在Django管理员中,我想覆盖并实现自己的模型形式(例如发票模型)。 我希望发票表单具有用于客户名称,产品名称的自动填写字段,并且我还想进行自定义验证(例如客户的信用额度)。如何覆盖Django管理员提供的默认格式并实现自己的默认格式? 问题答案: 如何根据docs在django admin中覆盖表单: