Python 给定每个产品都有多个版本,在my Django应用程序中,在产品/版本级别支持自定义属性的首选/最佳方式是什么

Python 给定每个产品都有多个版本,在my Django应用程序中,在产品/版本级别支持自定义属性的首选/最佳方式是什么,python,django,Python,Django,我正在构建我的第一个Django应用程序来管理多个SaaS产品 这需要为每个产品的每个版本存储自定义属性 例如,发布的产品的新版本包含早期版本的产品不支持的新配置选项 我需要能够为新版本的每个实例跟踪这些新值 我想我希望管理员能够按版本在产品级别添加自定义字段 寻找最佳方法的建议 谢谢。跟踪模型版本的常用方法是使用。听起来每个实例都需要自己的自定义属性。这意味着无需更改与产品和版本相关的模型。这很好,因为模型只能随着代码的变化而变化,除非您开始动态生成模型,这通常不是一个好主意 因此,您需要能够

我正在构建我的第一个Django应用程序来管理多个SaaS产品

这需要为每个产品的每个版本存储自定义属性

例如,发布的产品的新版本包含早期版本的产品不支持的新配置选项

我需要能够为新版本的每个实例跟踪这些新值

我想我希望管理员能够按版本在产品级别添加自定义字段

寻找最佳方法的建议


谢谢。

跟踪模型版本的常用方法是使用。

听起来每个实例都需要自己的自定义属性。这意味着无需更改与产品和版本相关的模型。这很好,因为模型只能随着代码的变化而变化,除非您开始动态生成模型,这通常不是一个好主意

因此,您需要能够为每个产品实例建模属性,而不管其版本如何。这应该是一个简单的数据建模练习,不一定与Django相关

产品有一组字段 一个产品有一个版本 产品具有一组属性 这很容易建模,具体取决于您希望如何管理属性

class Version(models.Model):
    version = models.CharField(max_length=10)

class ProductAttributes(models.Model):
    name = models.CharField(max_length=64)
    description = models.CharField(max_length=255)
    # other fields as necessary

class Product(models.Model):
    name = models.CharField(max_length=64)
    version = models.ForeignKey(Version)
    attributes = models.ManyToManyField(ProductAttributes, related_name='products')
这应该是你的建模分类在一个非常基本的方式。现在,让我们创建一些实例

v1 = Version(version='1.0.0')
v1.save()
hosted = ProductAttributes(name='Hosted', description='We host the apps!')
hosted.save()
shiny = ProductAttributes(name='Shiny', description='I like shiny')
shiny.save()
p = Product(name='Web Based Email', version=v1)
p.save()
p.attributes.add(hosted)
p.attributes.add(shiny)

p.attributes.all()
# shows shiny and hosted!

您可以调整产品的ModelAdmin,以便在添加或编辑产品时可以内联添加ProductAttributes。您还可以为ProductAttributes创建一个单独的ModelAdmin,这样您就可以创建一个已知属性列表,以便在以后应用于产品。

有两种基本方法

使用基于文档的db ie、NoSQL,如Coach或Mongo。它们具有灵活的模式,因此允许在产品上进行多种变化

使用实体属性值模式。是提供此功能的应用程序


决定使用每个产品的子类,因为每个产品都有一组有限的特定属性,这些属性不会随时间发生太大变化。谢谢你的反馈。学到了很多:-

所以django eav看起来很有前途,但我遗漏了一些让我有点困惑的东西。我需要能够在版本级别定义自定义属性,然后在实例级别实际存储/跟踪值。我的意思是,每个版本都有几个应用程序实例。因此,如果我为版本Y定义新的属性X,那么该版本Y的每个实例都需要属性X的值,但版本Z的实例不需要。有道理?