【问题标题】:Django trying to save object with existing primary keyDjango 尝试使用现有主键保存对象
【发布时间】:2020-10-07 15:20:45
【问题描述】:

今天发生了一件奇怪的事情。我在请求后从支付网关导入数据:

for signature in response.json:
    Signature.objects.get_or_create(**signature)

json 示例:

[
  {'id': 1, 'plan': 1, 'customer': 1},
  {'id': 31, 'plan': 12, 'customer': 22}
  {'id': 2, 'plan': 3, 'customer': 50},
  {'id': 3111, 'plan': 12, 'customer': 22},
  {'id': 222, 'plan': 12, 'customer': 22},
]

是的,我的客户没有按照 ID 序列在支付服务上手动注册签名,所以我正在导入并保持相同的 pk。

此代码按预期工作,数据现在与支付服务同步(所有对象已导入)。

现在奇怪的行为:

我正在使用 Django Rest Framework,并且在我的 API 中进行 POST(检查验证数据)之后,此行会出现以下错误:

Signature.object.create(**self.validated_data)

重复键值违反唯一约束 "plans_signature_pkey" DETAIL: Key (id)=(1) 已经存在。

验证数据:

{
   "plan": "3", # This is a foreign key to plan 3
   "payer_only": False,
   "schedule": "09:00",
   "payment_method: "CREDIT_CARD"
}

验证数据中没有 'pk': 1 或 'id': 1

Django 正在尝试使用现有键创建对象?

调试代码,然后我调用了 Subscription.create() 行 31 次:

重复键值违反唯一约束“plans_signature_pkey” 详细信息:键 (id)=(1) 已存在。

....

重复键值违反唯一约束“plans_signature_pkey” 详细信息:键 (id)=(31) 已存在。

在电话 32 上这有效。那么,我错过了什么吗?这在我看来是一种奇怪的行为。

【问题讨论】:

  • 看起来您重置了数据库中的序列。可能如果您尝试在数据库中创建元素,它也不会(立即)工作,直到序列被多次更新以生成新的 pk。
  • 这将与您数据库中的序列有关。我认为如果您提供这些附加信息会很有帮助:您的数据库设置、您的完整模型堆栈、序列化程序和与有问题的对象相关的视图。
  • @WillemVanOnsem 和 AliAsgari,确实如此。我试图从支付服务中保持相同的 pk,因为操作依赖于它。有什么建议吗?提前致谢。

标签: django django-rest-framework


【解决方案1】:

经过长时间的研究,我找到了解决方案。 我正在使用 POSTGRES,而 Django 使用 PostgreSQL 的 SERIAL 数据类型来存储自增键。手动主键分配停止 pk 自动增量。 解决办法:sqlsequencereset

$ django-admin sqlsequencereset app_label

“使用此命令生成 SQL,这将修复序列与其自动递增的字段数据不同步的情况。”

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    相关资源
    最近更新 更多