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 и выполнил миграции, после чего все заработало. Я ничего не менял в коде, поэтому понятия не имею, почему он выдал ошибку в первую очередь.

Спасибо всем, кто пытался помочь, мне даже как-то неловко, так как в конце концов один-единственный переключатель (на стол заказов) сделал свое дело. Но, как я уже сказал, я все еще учусь.

Вернуться на верх