Поле 'card_exp_month' ожидало число, но получило (4,) - Django и API stripe при добавлении в модель
Я пишу второй сайт электронной коммерции. Первый, похоже, работает отлично при загрузке данных из stripe API. Он извлекает данные карты и прекрасно сохраняет информацию в модель. На втором сайте я продолжаю получать следующую ошибку и не могу понять, почему. Любая помощь в решении этой проблемы была бы замечательной!
Field 'card_exp_month' expected a number but got (4,).
Вот код, который выполняется для сохранения данных, которые я получаю:
def process_card(order, charge):
print("I HAVE THE DATA AS: ", charge)
print("I have the brand as: ", charge.payment_method_details.card.brand)
print("I have the expiry year as: ", charge.payment_method_details.card.exp_year)
print("I have the expiry month as: ", charge.payment_method_details.card.exp_month)
print("I have the last 4 as: ", charge.payment_method_details.card.last4)
payment = order.payment
payment.stripe_payment_intent = order.stripe_payment_intent
payment.total_paid = Money(charge.amount / 100, charge.currency)
payment.card_brand = str(charge.payment_method_details.card.brand),
payment.card_exp_year = int(charge.payment_method_details.card.exp_year),
payment.card_exp_month = int(charge.payment_method_details.card.exp_month),
payment.card_last4 = str(charge.payment_method_details.card.last4),
payment.receipt_url = charge.receipt_url
payment.save()
order.stripe_payment_intent = None
order.order_flow = "PAID"
order.save()
Когда я просматриваю консоль, я получаю следующий вывод, который, кажется, показывает правильные значения, за которыми следует сообщение об ошибке!
I have the brand as: visa
I have the expiry year as: 2024
I have the expiry month as: 4
I have the last 4 as: 4242
3 I have an error as: Field 'card_exp_month' expected a number but got (4,).
Оператор print показывает только число 4, но когда я использую тот же код в последующей строке, оно становится (4,)???
Моя модель определяется следующим образом:
class Payment(models.Model):
order = models.OneToOneField(Order, on_delete=models.CASCADE, null=False, blank=False)
stripe_payment_intent = models.CharField(max_length=30, blank=True, null=True)
total_paid = MoneyField(max_digits=6, decimal_places=2, blank=False, null=False, default=0.00,
default_currency='AUD')
discount = MoneyField(max_digits=6, decimal_places=2, blank=False, null=False, default=0.00, default_currency='AUD')
refund_amount = MoneyField(max_digits=6, decimal_places=2, blank=False, null=False, default=0.00,
default_currency='AUD')
card_brand = models.CharField(max_length=10, null=True)
card_exp_month = models.SmallIntegerField(null=True)
card_exp_year = models.SmallIntegerField(null=True)
card_last4 = models.CharField(max_length=4, null=True)
receipt_url = models.TextField(null=True, blank=False)
created_at = models.DateTimeField(default=timezone.now, blank=False)
updated_at = models.DateTimeField(default=timezone.now, blank=False)
def __str__(self):
return self.order.order_number
Данные, которые поступают из API Stripe, следующие:
"payment_method_details": {
"card": {
"brand": "visa",
"checks": {
"address_line1_check": null,
"address_postal_code_check": "pass",
"cvc_check": "pass"
},
"country": "US",
"exp_month": 4,
"exp_year": 2024,
"fingerprint": "z6FNTx3llenE17ly",
"funding": "credit",
"installments": null,
"last4": "4242",
"network": "visa",
"three_d_secure": null,
"wallet": null
},
"type": "card"
},
Любая помощь, которую вы можете оказать, была бы замечательной.
Снова небольшая ошибка и огромное количество потраченного времени.
Но ... если кто-то еще столкнется с такой же проблемой, то запятые в конце строк, где я присваиваю значения, были причиной проблемы:
payment.card_brand = str(charge.payment_method_details.card.brand),
payment.card_exp_year = int(charge.payment_method_details.card.exp_year),
payment.card_exp_month = int(charge.payment_method_details.card.exp_month),
Удаление запятых заставило его работать как ожидалось!
payment.card_brand = str(charge.payment_method_details.card.brand)
payment.card_exp_year = int(charge.payment_method_details.card.exp_year)
payment.card_exp_month = int(charge.payment_method_details.card.exp_month)