Создание корзины покупок в Django Rest Framework
Я хочу реализовать корзину покупок в Django Rest Framework. Я храню информацию о корзине внутри моделей. Я не хочу использовать для этого сессию и хочу сохранить ее в базе данных. Пользователи должны быть зарегистрированы в системе, чтобы создавать и добавлять товары в корзину. Но я хочу, чтобы они могли добавить товар в корзину без входа в систему. Я буду очень благодарен, если вы сможете мне помочь. Спасибо
My Model :
class Cart(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
quantity = models.PositiveIntegerField()
My View:
class AddToCartApi(APIView):
serializer_class = AddToCartSerializer
permission_classes = [IsAuthenticated]
def post(self, request):
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
user_id = request.user.id
data = serializer.validated_data
Cart.objects.create(
user_id=user_id,
product_id=data['product_id'],
quantity=data['quantity'],
)
return Response(....)
Ну, в сценариях, где вы хотите, чтобы пользователи добавляли/обновляли корзину без регистрации :
Решение 1: Вы должны реализовать то же самое на стороне клиента, т.е. если ваш клиент взаимодействует через веб-браузер, вы можете использовать локальное/сеансовое хранилище. Позже, когда пользователь войдет в систему, вы сможете сохранить всю информацию в базе данных.
Чтобы создать корзину в Django Rest Framework, вы можете выполнить следующие шаги:
1) Определите модель Cart для хранения товаров в корзине. Модель должна содержать поля для пользователя, продукта и количества. Вы также можете добавить поля для промежуточного итога, общей суммы и любой другой информации, которую вам нужно хранить.
# carts/models.py
from django.db import models
class Cart(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
product = models.ForeignKey(Product, on_delete=models.CASCADE)
quantity = models.PositiveIntegerField()
subtotal = models.DecimalField(max_digits=10, decimal_places=2)
total = models.DecimalField(max_digits=10, decimal_places=2)
2)Создайте класс сериализатора для модели Cart для обработки сериализации и десериализации данных корзины.
# carts/serializers.py
from rest_framework import serializers
class CartSerializer(serializers.ModelSerializer):
class Meta:
model = Cart
fields = '__all__'
3) Создайте набор представлений и маршрутизатор для модели Cart для обработки конечных точек API.
# carts/views.py
from rest_framework import viewsets
class CartViewSet(viewsets.ModelViewSet):
queryset = Cart.objects.all()
serializer_class = CartSerializer
# carts/urls.py
from django.urls import include, path
from rest_framework import routers
router = routers.DefaultRouter()
router.register(r'carts', CartViewSet)
urlpatterns = [
path('api/', include(router.urls)),
]
4) Реализуйте конечные точки API для добавления товаров в корзину, обновления количества и удаления товаров из корзины. Вы можете использовать действия создания, обновления и уничтожения ModelViewSet для обработки этих операций.
# carts/views.py
class CartViewSet(viewsets.ModelViewSet):
queryset = Cart.objects.all()
serializer_class = CartSerializer
def create(self, request, *args, **kwargs):
# Create a new cart item
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def update(self, request, *args, **kwargs):
# Update the quantity of an existing cart item
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self