在 django 中表示具有额外属性的 manytomanyfield
Posted
技术标签:
【中文标题】在 django 中表示具有额外属性的 manytomanyfield【英文标题】:representing manytomanyfield with extra attributes in django 【发布时间】:2014-01-11 11:07:24 【问题描述】:我有一种情况,我需要在这些产品上存储一个“产品”表和一个“订单”表。
一个订单由许多 ("Product", "Quantity") 元组组成,其中数量是以吨表示的浮点数。
我考虑了以下实现,但我不认为拥有任意产品和数量的表格将是一个非常好的设计决策。
class Product(models.Model):
name = models.CharField("Name", max_length=50)
description = models.TextField("Description", blank=True)
class ProductOrder(models.Model):
unit = "tonnes"
product = models.ManyToManyField('Product')
quantity = models.FloatField('Quantity')
class Order(models.Model):
products = models.ManyToManyField('ProductOrder')
date = models.DateField('Date')
我是否忽略了一个明显的解决方案?您将如何实现这种关系以生成最 DRY 的代码。 (PS。我不想有单独的产品和数量列表,并且必须隐含地依赖它们的订购。)
【问题讨论】:
【参考方案1】:在 django 中,您可以使用 through
创建这样的中间表并在其中维护特定于订单的属性。
你可以实现它
class Product(models.Model):
name = models.CharField("Name", max_length=50)
description = models.TextField("Description", blank=True)
class Order(models.Model):
products = models.ManyToManyField('Product', through="OrderDetail")
date = models.DateField('Date')
class OrderDetail(models.Model):
unit = "tonnes"
product = models.ForeignKey('Product')
order = models.ForeignKey('Order')
quantity = models.FloatField('Quantity')
文档解释了如何使用和使用这种设计。
【讨论】:
所以我确实需要 OrderDetail 中的外键字段,但我宁愿引用 Order.OrderItems 而不是 Order.Products,因为这样我可以访问数量。OrderDetail
中的 2 个外键是 django 对 through
关系所必需的。以上是关于在 django 中表示具有额外属性的 manytomanyfield的主要内容,如果未能解决你的问题,请参考以下文章
使用 django-formtool 时如何在模板中表示 initial_dict
“InfoDictionary 版本”在信息属性列表(plist 文件)中表示啥?