Django serializer.save() выдает ответ об ошибке HTTP 500
У меня следующая простая установка: папка order
с файлом models.py
,
from django.contrib.auth.models import User
from django.db import models
from product.models import Product
class Order(models.Model):
user = models.ForeignKey(User, related_name='orders', on_delete=models.CASCADE)
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
email = models.CharField(max_length=100)
address = models.CharField(max_length=100)
zipcode = models.CharField(max_length=100)
place = models.CharField(max_length=100)
phone = models.CharField(max_length=100)
created_at = models.DateTimeField(auto_now_add=True)
paid_amount = models.DecimalField(max_digits=8, decimal_places=2, blank=True, null=True)
stripe_token = models.CharField(max_length=100)
class Meta:
ordering = ['-created_at',]
def __str__(self):
return self.first_name
class OrderItem(models.Model):
order = models.ForeignKey(Order, related_name='items', on_delete=models.CASCADE)
product = models.ForeignKey(Product, related_name='items', on_delete=models.CASCADE)
price = models.DecimalField(max_digits=8, decimal_places=2)
quantity = models.IntegerField(default=1)
def __str__(self):
return '%s' % self.id
a serializers.py
file
from rest_framework import serializers
from .models import Order, OrderItem
class OrderItemSerializer(serializers.ModelSerializer):
class Meta:
model = OrderItem
fields = [
"price",
"product",
"quantity",
]
class OrderSerializer(serializers.ModelSerializer):
items = OrderItemSerializer(many=True)
class Meta:
model = Order
fields = [
"id",
"first_name",
"last_name",
"email",
"address",
"zipcode",
"place",
"phone",
"stripe_token",
"items",
]
def create(self, validated_data):
items_data = validated_data.pop('items')
order = Order.objects.create(**validated_data)
for item_data in items_data:
OrderItem.objects.create(order=order, **item_data)
return order
и, наконец, файл views.py
import stripe
from django.conf import settings # get secret key
from rest_framework import status, authentication, permissions
from rest_framework.decorators import api_view, authentication_classes, permission_classes
from rest_framework.response import Response
from .serializers import OrderSerializer
@api_view(['POST'])
@authentication_classes([authentication.TokenAuthentication])
@permission_classes([permissions.IsAuthenticated])
def checkout(request):
serializer = OrderSerializer(data=request.data)
if serializer.is_valid():
stripe.api_key = settings.STRIPE_SECRET_KEY
paid_amount = sum(item.get('quantity') * item.get('product').price for item in serializer.validated_data['items'])
charge = stripe.Charge.create(
amount=int(paid_amount * 100),
currency='USD',
description='Charge from Djackets',
source=serializer.validated_data['stripe_token']
)
serializer.save(user=request.user, paid_amount=paid_amount)
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Теперь попытка отправить сообщение на checkout
дает ответ 500 со следующим следом ошибки:
Этот код взят из учебника Youtube, который не объясняет многое из того, что происходит. Мой вопрос: как решить эту ошибку?
Заранее спасибо!
Как следует из сообщения об ошибке, у вас нет столбца paid_amount
в таблице order_order
. Если вы изменили определение модели БД, вам необходимо сначала выполнить миграцию и применить ее.
python manage.py makemigrations && python manage.py migrate
Как указано в комментариях, запуск:
python manage.py makemigrations
и python manage.py migrate
не решили мою проблему. Он просто возвращает, что миграций нет.
Я решил проблему, аналогично включению/выключению кнопки, закомментировав столбец paid_amount
в моей модели и выполнив соответствующие миграции. Затем я раскомментировал столбец paid_amount
и выполнил миграции, после чего все заработало. Я ничего не менял в коде, поэтому понятия не имею, почему он выдал ошибку в первую очередь.
Спасибо всем, кто пытался помочь, мне даже как-то неловко, так как в конце концов один-единственный переключатель (на стол заказов) сделал свое дело. Но, как я уже сказал, я все еще учусь.