首页 > 解决方案 > 如何将多个 PRODUCTS 的“主键”字段存储在一个 ORDER 的“Order_Product”字段中?

问题描述

简而言之,我想为每个订单条目选择多个产品。我应该使用某种字符串操作方法将所有选定的产品组合在一个字符串中并将其保存到单个字段中吗?这听起来很明显,但我不认为它要走,因为它像大多数数据库设计一样面对订单及其多种产品,应该有更好的方法来处理它。请建议一种更好的做法或一些神奇的东西,比如可以在一个外键字段中存储多个主键,但似乎这不是最佳做法。所以我该怎么做 ?

Order_Product = models.ForeignKey(Product, on_delete=models.CASCADE)
# im thinking of making below field into a string holding container
# and join many primary key and just outright save it separating by commas
Order_SelectedProduct = models.CharField(max_length=1000)

Order_Amount = models.CharField(max_length=10)
Order_Qty = models.CharField(max_length=10)
Order_Date = models.CharField(max_length=10)
Order_Deadline = models.CharField(max_length=10)
Order_Reference = models.CharField(max_length=128)

def __str__(self):
    return self.Order_Id

显然 Order_SelectedProduct 字段不是理想的方式,因为一个主需要 14 个空间,所以说一个订单只能被限制为每个订单只能存储 71 个产品,这绰绰有余,但不可扩展。我希望它能结出丰硕的成果

标签: pythondjangodatabasedjango-models

解决方案


你需要的是多对多的关系。

为此,您可以将模型定义为:

模型.py

class Product(models.Model):
    ....

    def __str__(self):
        return self.id

class Order(models.Model):
    Order_Product = models.ManyToManyField(Product)
    ...

然后,要在订单对象中添加多个产品,您可以执行以下操作:

order = Order() --> create a order object
order.Order_Product.add(product1)
order.Order_Product.add(product2)
# product1 and product2 are the product objects that were selected
# and so on
order.save()

更多说明,可以参考django多对多关系


推荐阅读