在 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

如何在Django Admin中表示这种两级深层关系?

“InfoDictionary 版本”在信息属性列表(plist 文件)中表示啥?

“InfoDictionary 版本”在信息属性列表(plist 文件)中表示啥?

声音的哪些属性可以在代码中表示/计算?

如何在数据库中表示一个实体的许多相似属性?