【问题标题】:Modeling product orders in Django在 Django 中建模产品订单
【发布时间】:2019-04-05 02:40:17
【问题描述】:

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

每个订单都有属性:

id
email
total_price
line_items

line_items 是一个产品字典以及该产品所需的实例数。

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

我需要 Product 和 Order 之间的多对多关系,因为每个产品可能是多个订单的一部分,但每个订单可能有很多产品 - 如果我的订单包含一种产品的 3 个实例,另一种产品的 2 个实例……?

【问题讨论】:

  • 这不应该是多对多吗,通过使用一对多,您基本上可以说每个订单都有一个产品(或者如果我们颠倒关系,每个产品都只有一个订单)。
  • 是的,你是对的!

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


【解决方案1】:

line_items 是产品字典以及所需产品的实例数。

我建议不要将其存储在字典中。在关系数据库中,通常将其存储在多条记录的不同表中。这样做的好处是易于查询。例如生成包含某个产品的所有订单的列表,或者包含数量大于 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)

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

【讨论】:

  • 如何使用大宗商品/产品创建订单?这种模型结构可以吗?比如说,我需要创建一个包含多个产品/项目的订单,我可以使用这个模型结构吗? @Willem Van Onsem
  • @RTan:你只是批量创建OrderProducts,所以像OrderProduct.objects.bulk_create(list_of_orderproducts)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 1970-01-01
  • 2016-05-14
  • 2019-12-28
  • 1970-01-01
  • 2021-03-23
相关资源
最近更新 更多