我正在寻找关于在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字段?抛弃这整个追求,并用更好的东西去做?
感谢您的帮助!
答案 0 :(得分:2)
如果您正在某种eav style中寻找django中模型的动态属性实现,请查看eav-django或django-expando。
答案 1 :(得分:1)
这是普通的关系数据库设计。不要使用OO和继承技术对其进行过度优化。
您有一个产品类别表,其中包含(可能)名称。
您有一个产品类型表,其中FK的类别信息不多。
您有一个与产品类型有FK关系的Product表。
您有一个产品功能表,其中包含您的数据点和产品的FK。
要使用产品,您需要查询产品。如果您需要这些功能,那么您只需使用“feature_set”即可。 Django为你取了它们。
这非常有效,是关系数据库和ORM层的一个完善的功能。数据库缓存和ORM缓存使这些查询非常快速。