django - 在 Django 中建模产品订单

标签 django django-models foreign-keys many-to-one

我有一个特定产品列表的订单,我需要在 Django 中对其进行建模。

每个订单都有属性:

id
email
total_price
line_items

line_items 是产品字典和该产品所需的实例数。

产品是描述一类产品的单独模型。

我需要 Product 和 Order 之间的多对多关系,因为每个产品可能是许多订单的一部分,但每个订单可能有很多产品 - 这在我的字段中看起来如何,因为我可以有一个订单一种产品的 3 个实例,另一种产品的 2 个实例……?

最佳答案

line_items is a dictionary of products and the number of instances of that product required.

我建议不要将其存储在字典中。在关系数据库中,通常将其存储在包含多个记录的不同表中。这样做的好处是,很容易查询。例如生成包含特定产品的所有订单的列表,或包含数量高于 50 的特定产品。

因此,我们通常有三个表:

+-------+  1    N  +--------------+  N    1  +---------+
| Order |----------| OrderProduct |----------| Product |
+-------+          +--------------+          +---------+
| email |          | quantity     |
+-------+          +--------------+

我们因此有了三个模型:OrderOrderProductProduct,例如:

Order(models.Model):
    email = models.EmailField()

Product(models.Model):
    # ...
    pass

OrderProduct(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)

    class Meta:
        unique_together = ('order', 'product')

因此,我们可以构造一个订单:

product1 = Product.objects.create()
product2 = Product.objects.create()
my_order = Order.objects.create(email='foo@bar.com')
OrderProduct.objects.create(product=product1, order=my_order)
OrderProduct.objects.create(product=product2, order=my_order, quantity=14)

所以这里我们构建了两个产品和一个订单,我们在这个订单中添加了两个OrderProduct,一个用于product1,一个用于product2 数量为 14

关于django - 在 Django 中建模产品订单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53091688/

相关文章:

python - Django models.Model 父类(super class)

python - 我正在学习 Conda environment.yml,我不确定如何让 Conda 找到特定版本的依赖项

mysql - 尝试删除外键时出现错误#1064

具有 FK 约束的 MySQL/InnoDB : find tables/rows affected by cascaded delete

python - 在 Python 中全局处理对象的属性?

mysql外键不起作用

django - 在 Django 中,是否可以从自定义标签内访问当前用户 session ?

python - UUIDField 的 Django 1.10 全文搜索返回 DataError

python - Django ManyToManyField 排除

python - Django 无法通过管理员下载文件