Django:关于设计具有不同字段的模型的建议

时间:2010-08-31 15:05:35

标签: python django orm models

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

结构需要描述产品的数据。大约有60种不同的可能数据点可能是相关的,每个产品根据其ProductType选择大约20个这些点(重叠很多)。大约有24种不同的ProductTypes,每种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字段?抛弃这整个追求,并用更好的东西去做?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

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

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

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

要使用产品,您需要查询产品。如果您需要这些功能,那么您只需使用“feature_set”即可。 Django为你取了它们。

这非常有效,是关系数据库和ORM层的一个完善的功能。数据库缓存和ORM缓存使这些查询非常快速。