python - 如何通过将新产品添加到 ManyToMany 字段来动态添加字段

标签 python sql django subquery

我正在尝试创建一个基于 django 的餐厅订单管理系统

当有人点某种食物时,可能会点3个Pizza加2个三明治,如何让顾客定义每种产品的数量,然后计算其价格

class Restaurant(models.Model):
    name = models.CharField(max_length=50)
    price = models.PositiveIntegerField(default=1)


    def __str__(self):
        return self.name

class Topping(models.Model):
    name = models.CharField(max_length=50)
    product_names = models.ManyToManyField(Restaurant, blank=True)
    quantity = models.PositiveIntegerField(default=1)

订单总价,例如一种产品:一份披萨加一份三明治,但他们订购了不止一份披萨和三明治

    @property
    def total(self):  
        return self.product_names.aggregate(Sum('price'))['price__sum'] 

我希望为每个选定的项目提供一个数量字段:披萨:3,三明治:2,然后计算它们(3*披萨价格,2*三明治价格)

最佳答案

您应该构造一个 through=... model [Django-doc]ManyToManyField [Django-doc] ,例如:

from django.db import models
from django.db.models import <b>F, Sum</b>

class Product(models.Model):
    name = models.CharField(max_length=50)
    price = models.PositiveIntegerField(default=1)

    def __str__(self):
        return self.name

class Order(models.Model):
    name = models.CharField(max_length=50)
    products = models.ManyToManyField(Product, <b>through='ProductOrder'</b>)

    @property
    def total(self):  
        return self.productorder_set.aggregate(
            <b>price_sum=Sum(F('quantity') * F('product__price'))</b>
        )['price_sum'] 

class <b>ProductOrder</b>(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    order = models.ForeignKey(Order, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)

ProductOrder 因此是多对多关系中的一条记录,因此表示该 product 是该 order 的一部分> 具有给定的数量

然后我们可以使用 Sum(F('quantity') * F('product__price')) 计算总价,因此这些记录的数量之和乘以相关记录的价格产品。

关于python - 如何通过将新产品添加到 ManyToMany 字段来动态添加字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56972613/

相关文章:

sql - 操作数数据类型 NULL 对于 max 运算符无效

python - 在Windows上使用python科学模块出现属性错误

python - 使用soaplib生成的错误(?)数据类型

php - 首先选择最高百分比的 php sql

SQL CASE语句具体例子

django - 为什么可以在 "multiple ways"处导入UpdateView

python - 带有 CKEditor 的 Django 2.0.1 在管理页面上不起作用

Django:将 db_index 添加到现有表

python - Pandas 在 Mac OS X 上的安装 : ImportError (cannot import name hashtable)

python - 对象检测训练的 Cloud ML Engine 警告消息 : Ignoring ground truth with image id