【发布时间】: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