【问题标题】:How to create a cart with Django rest framework?如何使用 Django rest 框架创建购物车?
【发布时间】:2021-01-10 21:19:28
【问题描述】:

我正在使用 Django REST 框架编写 REST API 我想用 Django rest 为咖啡店创建一个购物车,但我不知道如何为我的项目创建视图和 serializers.py。我创建了我的模型和购物车类,但我无法编写 views.py 和 Serializers.py 和 urls.py 请帮助我。

这是我的模型和购物车类:

#models.py

from django.db import models
from coffishop import settings


class Food(models.Model):
    name = models.CharField(max_length=100)
    price = models.PositiveIntegerField()
    type = models.CharField(max_length=50)
    info = models.TextField()
    image = models.ImageField(upload_to='images/')

    def __str__(self):
        return self.name


class Order(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='orders')
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    paid = models.BooleanField(default=False)

    class Meta:
        ordering = ('-created',)

    def __str__(self):
        return f'{self.user} - {str(self.id)}'

    def get_total_price(self):
        total = sum(item.get_cost() for item in self.items.all())
 


class OrderItem(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='items')
    product = models.ForeignKey(Food, on_delete=models.CASCADE, related_name='order_items')
    price = models.IntegerField()
    quantity = models.PositiveSmallIntegerField(default=1)

    def __str__(self):
        return str(self.id)

    def get_cost(self):
        return self.price * self.quantity

#cart 类

from menu.models import Food


CART_SESSION_ID = 'cart'
class Cart:
    def __init__(self, request):
        self.session = request.session
        cart = self.session.get(CART_SESSION_ID)
        if not cart:
            cart = self.session[CART_SESSION_ID] = {}
        self.cart = cart

    def __iter__(self):
        food_ids = self.cart.keys()
        foods = Food.objects.filter(id__in=food_ids)
        cart = self.cart.copy()
        for food in foods:
            cart[str(food.id)]['food'] = food

        for item in cart.values():
            item['total_price'] = int(item['price']) * item['quantity']
            yield item

    def remove(self, product):
        food_id = str(food.id)
        if food_id in self.cart:
            del self.cart[food_id]
            self.save()

    def add(self, food, quantity):
        food_id = str(food.id)

        if food_id not in self.cart:
            self.cart[food_id] = {'quantity':0, 'price':str(food.price)}
        self.cart[food_id]['quantity'] += quantity
        self.save()

    def save(self):
        self.session.modified = True

    def get_total_price(self):
        return sum(int(item['price']) * item['quantity'] for item in self.cart.values())

    def clear(self):
        del self.session[CART_SESSION_ID]
        self.save()

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    请遵循 DRF 其余文档。我提到了一些资源

    https://www.django-rest-framework.org/tutorial/1-serialization/#creating-a-serializer-class

    https://realpython.com/django-rest-framework-quick-start/#drf-quick-start

    http://www.cdrf.co/

    如果你想重用你的购物车类,那么https://www.django-rest-framework.org/api-guide/views/#class-based-views

    serializer.py 用于序列化您的请求和响应结构。它与您的 django 模型相结合。 Views.py 处理您的业务逻辑,您可以通过使用 REST 方法在其中使用购物车类。 urls.py 公开你的 API 端点

    【讨论】:

    • 我以前读过它们。我知道什么视图和序列化程序意味着我知道这个概念,但我仍然无法编写自己的代码。我应该多练习,但我没有太多时间做这个项目
    • 我可以帮你添加你的观点。我不知道你的完整要求。我可以开车继续。可以直接使用 Views.py
    • 感谢您的帮助。我希望他们之前在我的网站上注册的用户可以订购食物,并且他们有一个购物车,用于添加其他食物或更新和删除他们订购的食物。我向他们展示总价,然后他们指导支付价格。我使用 Model Serializers 编写序列化程序,请您帮我完成视图。
    • 如果您能够编写消毒器,则使用特定于模型的通用视图。只需将您的消毒器与您的观点结合起来。你完成了django-rest-framework.org/api-guide/generic-views
    【解决方案2】:
    from rest_framework.views import APIView
    
    class CartAPI(APIView):
        """
        
        """
      
        
        def get(self, request, format=None):
            """
            Return a list of all users.
            """
            cart=Cart(request)
            ## call required method
            ## for response https://www.django-rest-framework.org/api-guide/responses/#creating-responses
            return Response({"data": data}, status=Status.OK) 
        def post(self, request, **kwargs):
           """
           """
           cart=Cart(request)
           ## call required method
           return Response()
    

    【讨论】:

      猜你喜欢
      • 2018-11-29
      • 2021-08-31
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 2014-03-13
      • 2020-10-19
      • 2016-02-20
      相关资源
      最近更新 更多