我们在系统上使用paypal来检查用户之前是否已付款且已有帐户。 今天早上我收到的追溯基本上给了我一个完整性错误。
IntegrityError:(1062,“密钥2的重复条目'user_1234_before'”)
我的状态如下:
try:
user = User.objects.get(email=ipn_obj.payer_email)
except:
user_slug = ("%s_%s_before") % (ipn_obj.first_name, ipn_obj.last_name)
username = slugify(user_slug)
user = User.objects.create_user(username, ipn_obj.payer_email, 'testpassword')
user.first_name = ipn_obj.first_name
user.last_name = ipn_obj.last_name
user.save()
提前致谢。
答案 0 :(得分:5)
从不使用空白except
语句。这里发生的事情很好地证明了原因。
您可能使用try / except块来捕获User.DoesNotExist
异常。但是,您的代码实际上提出了一个完全不同的异常。因为你吞下它,所以不可能知道哪一个,但可能ipn_obj
不是你认为的那样,并且没有payer_email
错误,所以你得到{{1 }}。或者,您可能获得AttributeError
例外。
将您的User.MultipleObjectReturned
更改为except
,然后调试您的实际问题。
答案 1 :(得分:1)
我认为您有两个用户使用不同的payer_mail
但first_name
和last_name
username
:username
(由姓和名组成)对于两个用户是相同的用户。可能User
是User.DoesNotExist
上的唯一键,会给您错误。
除了捕获正确的异常(username
)之外,如果你想保留你的代码,我认为你应该使用电子邮件字段(我认为是唯一的)来“统一”user_slug = ("%s_%s_before") % (ipn_obj.first_name, ipn_obj.last_name)
:
user_slug = ("%s_%s_%s_before") % (ipn_obj.first_name, ipn_obj.last_name, ipn_obj.payer_email)
使用:
user_slug = ("%s_before") % (ipn_obj.payer_email)
或:
{{1}}
答案 2 :(得分:0)
实际上是由具有已用户名的用户的创建(即INSERT语句)引发的。 在插入之前,您应检查它的存在。