python - 如何将多个 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 个产品,这绰绰有余,但不可扩展。我希望它能结出丰硕的成果
解决方案
你需要的是多对多的关系。
为此,您可以将模型定义为:
模型.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多对多关系
推荐阅读
- python - Pyspark rdd 操作!(Python3、Spark2)
- javascript - 如何为表格的每一行创建展开/折叠功能?角6
- javascript - JS。我想将函数存储到对象,然后将其用作匿名对象
- orientdb - 使用 Orientdb 3 和 tinkerpop 3 识别 2 个顶点是否与边缘连接
- python - 是否可以使用间隔查询 Pandas IntervalIndex
- visual-studio - Visual Studio 2017(专业版)脱机更新布局缺少包
- tensorflow - 权重矩阵提供什么信息?
- django - Django 后台任务间隔
- python - Django ManyToMany 字段返回 None 但它有相关记录
- c# - 定义两个可为空的隐式运算符时无法将 null 转换为 struct