在Django中建模产品订单

时间:2018-10-31 20:44:05

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

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

每个订单都具有以下属性:

id
email
total_price
line_items

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

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

我需要在产品与订单之间建立多对多的关系,因为每个产品可能是许多订单的一部分,但是每个订单可以有很多产品-如果我可以拥有一个包含一个产品有3个实例,另一个产品有2个实例……?

1 个答案:

答案 0 :(得分:2)

  

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)

因此,我们在这里构造了两个产品和一个订单,并向该订单添加了两个OrderProduct,一个为product1,一个为product2,数量为{{1 }}。