首页 > 解决方案 > 购物车数据库未显示订购的单个商品数量

问题描述

我正在尝试创建一个购物车模型,我已经创建了 Order 模型、OrderItem 模型以及 Item 模型。虽然我发现很难将它模型的订单链接到 API 视图中的订单。

这是模型

class Pizza(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=60)
    desc = models.CharField(max_length=150)
    price = models.IntegerField()
    url = models.CharField(max_length=250)
    def __str__(self):
        return self.name


class OrderItem(models.Model):
    id = models.AutoField(primary_key=True)
    product = models.ForeignKey("Pizza", on_delete=models.CASCADE, null=True)
    date_added = models.DateTimeField(auto_now=True)
    date_ordered = models.DateTimeField(null=True)
    amount = models.IntegerField(null=True)


    def __str__(self):
        return self.product.name



class Order(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=60)
    email = models.CharField(max_length=150)
    address = models.CharField(max_length=150)
    total = models.IntegerField()
    created_at = models.DateTimeField(default=timezone.now)
    items = models.ManyToManyField(OrderItem)

    def __str__(self):
        return self.name
//The viewset

class OrderViewSet(viewsets.HyperlinkedModelSerializer):
    # permission_classes = [IsPostOrIsAuthenticated,]

    serializer_class = OrderSerializer

    queryset = Order.objects.all().order_by('-created_at')

目前,我无法在我的 API 中显示订单项目的金额属性,它只显示 id 以及指向订单中单个订单项目的链接

标签: pythondjangodjango-modelsdjango-rest-frameworkdjango-views

解决方案


我认为对于购物车,您可以在 Order 和 Pizza 之间的关系上使用外部字段。关于这里的文档

您的模型如下所示:

class Pizza(models.Model):
    name = models.CharField(max_length=60)
    desc = models.CharField(max_length=150)
    price = models.IntegerField()
    url = models.CharField(max_length=250)

    def __str__(self):
        return self.name


class Order(models.Model):
    name = models.CharField(max_length=60)
    email = models.CharField(max_length=150)
    address = models.CharField(max_length=150)
    total = models.IntegerField()
    created_at = models.DateTimeField(auto_now=True)
    items = models.ManyToManyField(Pizza, through='OrderItem')

    def __str__(self):
        return self.name


class OrderItem(models.Model):
    product = models.ForeignKey('Pizza', on_delete=models.CASCADE, null=True)
    order = models.ForeignKey('Order', on_delete=models.CASCADE, null=True)
    date_added = models.DateTimeField(auto_now=True)
    date_ordered = models.DateTimeField(null=True)
    amount = models.IntegerField(null=True)

    def __str__(self):
        return self.product.name

例如,如何按顺序获取项目数量的字典:

order = Order.objects.filter('-created_at').first() // get last order
cart = {item.pk: item.amount for item in order.items}

推荐阅读