#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. Это работает для меня, спасибо, сэр !