Django 尝试使用现有主键保存对象

Die*_*ães 4 django django-rest-framework

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

for signature in response.json:
    Signature.objects.get_or_create(**signature)
Run Code Online (Sandbox Code Playgroud)

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},
]
Run Code Online (Sandbox Code Playgroud)

是的,我的客户没有遵循在支付服务上手动注册签名的 ID 序列,因此,我导入并保留相同的 pk。

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

现在奇怪的行为:

我正在使用 Django Rest Framework,在我的 API 中执行 POST(检查 valid_data)后,此行会出现以下错误:

Signature.object.create(**self.validated_data)
Run Code Online (Sandbox Code Playgroud)

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

验证数据:

{
   "plan": "3", # This is a foreign key to plan 3
   "payer_only": False,
   "schedule": "09:00",
   "payment_method: "CREDIT_CARD"
}
Run Code Online (Sandbox Code Playgroud)

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

Django 正在尝试使用现有密钥创建一个对象?

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

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

....

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

拨打 32 即可。那么,我错过了什么吗?这对我来说看起来很奇怪。

Die*_*ães 9

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

\n
$ django-admin sqlsequencereset app_label\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n