django尝试导致IntegrityError的异常语句:

时间:2011-05-03 07:55:34

标签: django django-views

我们在系统上使用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()

提前致谢。

3 个答案:

答案 0 :(得分:5)

从不使用空白except语句。这里发生的事情很好地证明了原因。

您可能使用try / except块来捕获User.DoesNotExist异常。但是,您的代码实际上提出了一个完全不同的异常。因为你吞下它,所以不可能知道哪一个,但可能ipn_obj不是你认为的那样,并且没有payer_email错误,所以你得到{{1 }}。或者,您可能获得AttributeError例外。

将您的User.MultipleObjectReturned更改为except,然后调试您的实际问题。

答案 1 :(得分:1)

我认为您有两个用户使用不同的payer_mailfirst_namelast_name usernameusername(由姓和名组成)对于两个用户是相同的用户。可能UserUser.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语句)引发的。 在插入之前,您应检查它的存在。