Django正在尝试使用现有主键保存对象
今天发生了一件奇怪的事。我在请求后从支付网关导入数据:Django正在尝试使用现有主键保存对象,django,django-rest-framework,Django,Django Rest Framework,今天发生了一件奇怪的事。我在请求后从支付网关导入数据: 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': 3
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
此代码按预期工作,数据现在与payment service导入的所有对象同步
现在奇怪的行为是:
我使用的是Django Rest框架,在API中经过后期检查验证的_数据后,这一行出现以下错误:
Signature.object.create(**self.validated_data)
重复的键值违反了唯一约束
计划\签名\密钥详细信息:密钥id=1已存在
验证数据:
{
"plan": "3", # This is a foreign key to plan 3
"payer_only": False,
"schedule": "09:00",
"payment_method: "CREDIT_CARD"
}
验证数据中没有“主键”:1或“id”:1
Django正在尝试使用现有密钥创建对象
调试代码时,我调用了Subscription.create行31次,然后:
重复的键值违反唯一约束计划\u签名\u pkey
详细信息:密钥id=1已存在
重复的键值违反唯一约束计划\u签名\u pkey
详细信息:密钥id=31已存在
在呼叫32时,这是有效的。那么,我是不是遗漏了什么?在我看来,这是一种奇怪的行为。经过长时间的研究,我找到了解决办法。 我使用POSTGRES,Django使用PostgreSQL的串行数据类型来存储自动递增键。手动主键分配会停止pk自动递增。 解决方案:
使用此命令生成SQL,它将修复序列与其自动递增的字段数据不同步的情况。经过长期研究,我找到了解决方案。 我使用POSTGRES,Django使用PostgreSQL的串行数据类型来存储自动递增键。手动主键分配会停止pk自动递增。 解决方案:
使用此命令生成SQL,它将修复序列与其自动递增的字段数据不同步的情况。看起来您在数据库中重置了序列。很可能,如果您尝试在数据库中创建元素,它也不会立即工作,直到序列被更新多次以生成新的pk。这可能与数据库中的序列相关。我认为,如果您提供以下传统信息会有所帮助:您的数据库设置、完整的模型堆栈、序列化程序以及与存在问题的对象相关的视图。@WillemVanOnsem和AliAsgari,的确如此。我试图从支付服务中保留相同的pk,因为操作依赖于它。有什么建议吗?谢谢。看来你在数据库中重置了序列。很可能,如果您尝试在数据库中创建元素,它也不会立即工作,直到序列被更新多次以生成新的pk。这可能与数据库中的序列相关。我认为,如果您提供以下传统信息会有所帮助:您的数据库设置、完整的模型堆栈、序列化程序以及与存在问题的对象相关的视图。@WillemVanOnsem和AliAsgari,的确如此。我试图从支付服务中保留相同的pk,因为操作依赖于它。有什么建议吗?谢谢,这是事先准备好的。
$ django-admin sqlsequencereset app_label