Не удалось выполнить уникальное ограничение Django IntegrityError: plans_customer.user_id

#python #django #integrity

Вопрос:

У меня проблема с моим видом оформления заказа. После того, как я добавил проверку пользователя по электронной почте, я получаю ошибку целостности. Я хотел бы знать, как решить эту проблему. Я уже проверил некоторые решения из Интернета, но ни одно из них не работает для меня.

Некоторая основная информация:

Способ запроса: ОТПРАВИТЬ

URL-адрес запроса: http://127.0.0.1:8000/checkout

Версия Django: 2.2.3

Тип исключения: Ошибка целостности

Значение Исключения:

Не удалось выполнить уникальное ограничение: plans_customer.user_id

Вот мой вид оформления заказа:

 @login_required
 

проверка(запрос):

 try:
    if request.user.customer.membership:
        return redirect('settings')
except Customer.DoesNotExist:
    pass

coupons = {'bank':25, 'city':25}

if request.method == 'POST':
    stripe_customer = stripe.Customer.create(email=request.user.email, source=request.POST['stripeToken'])
    plan = 'price_1IC3TwL0fAQS9DO5lqZSmcew'
    if request.POST['plan'] == 'yearly':
        plan = 'price_1IC3TwL0fAQS9DO5IKzHz5ZI'
    if request.POST['coupon'] in coupons:
        percentage = coupons[request.POST['coupon'].lower()]
        try:
            coupon = stripe.Coupon.create(duration='once', id=request.POST['coupon'].lower(),
            percent_off=percentage)
        except:
            pass
        subscription = stripe.Subscription.create(customer=stripe_customer.id,
        items=[{'plan':plan}], coupon=request.POST['coupon'].lower())
    else:
        subscription = stripe.Subscription.create(customer=stripe_customer.id,
        items=[{'plan':plan}])

    customer = Customer()
    customer.user = request.user
    customer.stripeid = stripe_customer.id
    customer.membership = True
    customer.cancel_at_period_end = False
    customer.stripe_subscription_id = subscription.id
    customer.save()

    msg_plain = render_to_string('mails/email.txt')
    msg_html = render_to_string('mails/email.html')
    subject = 'Welcome to J amp; M Traders'
    recepient = str(request.user.email)
    send_mail(subject,
              msg_plain, EMAIL_HOST_USER, [recepient], html_message=msg_html)

    return redirect('home')
else:
    coupon = 'none'
    plan = 'monthly'
    price = 9999
    og_dollar = 99.99
    coupon_dollar = 0
    final_dollar = 99.99
    if request.method == 'GET' and 'plan' in request.GET:
        if request.GET['plan'] == 'yearly':
            plan = 'yearly'
            price = 94999
            og_dollar = 949.99
            final_dollar = 949.99
    if request.method == 'GET' and 'coupon' in request.GET:
        print(coupons)
        if request.GET['coupon'].lower() in coupons:
            print('fam')
            coupon = request.GET['coupon'].lower()
            percentage = coupons[request.GET['coupon'].lower()]


            coupon_price = int((percentage / 100) * price)
            price = price - coupon_price
            coupon_dollar = str(coupon_price)[:-2]   '.'   str(coupon_price)[-2:]
            final_dollar = str(price)[:-2]   '.'   str(price)[-2:]


    return render(request, 'plans/checkout.html',
    {'plan':plan,'coupon':coupon,'price':price,'og_dollar':og_dollar,
    'coupon_dollar':coupon_dollar,'final_dollar':final_dollar})
 

и моя модель:

 class Customer(models.Model):
   user = models.OneToOneField(User, on_delete=models.CASCADE)
   email_confirmed = models.BooleanField(default=False)
   stripeid = models.CharField(default=False, max_length=255)
   stripe_subscription_id = models.CharField(default=False, max_length=255)
   cancel_at_period_end = models.BooleanField(default=False)
   membership = models.BooleanField(default=False)
 

Комментарии:

1. Поскольку это a OneToOneField , два Customer s не могут указывать на одного и того же пользователя, здесь вы, таким образом, создаете два Customer s с одинаковым user .

2. Хорошо, если я правильно понимаю. Один пользователь создается во время процесса регистрации, а другой пытается быть созданным во время проверки, и в этом причина ?

3. да, в этом, скорее всего, и заключается проблема.

4. Это работает для меня, спасибо, сэр !