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 即可。那么,我错过了什么吗?这对我来说看起来很奇怪。
经过长时间的研究,我找到了解决方案。\n我正在使用 POSTGRES,Django 使用 PostgreSQL\xe2\x80\x99s SERIAL 数据类型来存储自动增量键。手动主键分配会停止 pk 自动增量。\n解决方案:sqlsequencereset
\n$ django-admin sqlsequencereset app_label\nRun Code Online (Sandbox Code Playgroud)\n“使用此命令生成 SQL,这将修复序列与其自动递增的字段数据不同步的情况。”
\n| 归档时间: |
|
| 查看次数: |
1539 次 |
| 最近记录: |