【问题标题】:Django: Advice on designing a model with varying fieldsDjango:关于设计具有不同字段的模型的建议
【发布时间】:2011-04-06 08:04:36
【问题描述】:

我正在寻找一些关于在 django 中创建某种动态模型的最佳方法的建议/意见。

结构需要描述产品的数据。大约有 60 个可能相关的不同数据点,每个产品根据其 ProductType 选择其中大约 20 个点(有很多重叠)。大约有 2 打不同的 ProductType,每个 ProductType 都属于 6 个类别之一。

显而易见但不优雅的方法是将所有 100 个数据点放入 Product 模型中,然后随意选择,忽略任何留空的字段。优点:很明显。缺点:丑陋,如果需要添加更多数据点,需要更新数据库。

我的想法是让每个产品完全抽象,只定义它的产品类型,以及其他一些识别特征。

class Product(models.Model):
    productType = models.ForeignKey(ProductType)

然后,我将为每种数据点(数字、文本、日期等)创建一个单独的模型,如下所示:

class TextData(models.Model):
    fieldName = models.CharField(etc)
    verboseName = models.CharField(etc)
    data = models.CharField(etc)
    product = models.ForeignKey(Product)

最后,我会创建一个模型来定义与每种产品类型相关的数据类型,以及每个数据点应该被称为什么。

class ProductType(models.Model):
    name = models.CharField(etc)
    ....

所以主要问题是:当产品类型的相关字段可能不同时,填写相关字段的最佳方式是什么?也许另一个模型包含数据点的名称/类型,以及 ProductType 和该模型之间的 ManyToManyField?带有 XML 的文本字段?定义结构的外部 XML 字段?放弃这整个追求,去做更好的事情吗?

感谢您的帮助!

【问题讨论】:

    标签: python django orm models


    【解决方案1】:

    这是普通的关系数据库设计。不要使用 OO 和继承技术对其进行过度优化。

    您有一个产品类别表,其中(可能)只是名称。

    您有一个产品类型表,其中包含 FK 到类别的信息不多。

    您有一个与产品类型有 FK 关系的产品表。

    您有一个产品功能表,其中包含您的数据点和产品的 FK。

    要使用产品,您需要查询产品。如果您需要这些功能,您只需使用“feature_set”。 Django 为您获取它们。

    这非常有效,并且是关系数据库和 ORM 层的成熟特性。 DB 缓存和 ORM 缓存使这些查询执行得非常快。

    【讨论】:

      【解决方案2】:

      如果您正在寻找在 django 中以某种 eav style 形式实现模型的动态属性,请查看 eav-djangodjango-expando

      【讨论】:

        猜你喜欢
        • 2019-08-10
        • 1970-01-01
        • 2011-08-05
        • 2013-06-12
        • 1970-01-01
        • 1970-01-01
        • 2014-03-30
        • 2018-03-16
        • 1970-01-01
        相关资源
        最近更新 更多