我需要一些帮助来改进我建立的网站的架构。我想在单个Django项目中实现的目标如下:
我希望保留该版本的所有旧版本网站和应用程序状态,但仍然可以为任何其他版本添加/更改/删除应用程序。也就是说,应用程序的版本可能不同(模型,方法,管理,模板,基本上任何东西)。
我希望每个属于某个版本的应用都只拥有该版本的数据。版本2012上的App1应该有一个数据库表,而版本2013上的App1应该有另一个,即使它们是相同的。
看起来像这样:
site.com/2012
App1_v1
App2_v1
site.com/2013
App1_v1
App2_v2 (maybe added some fields or methods, changed templates)
site.com/2014
App1_v2
App2_v2
App3_v1
我目前的解决方案非常糟糕。当一个新版本的网站启动时,我只需复制粘贴一个早期的应用程序,让原有的应用程序保持原样,然后添加/修改新版本的应用程序。但是,当我添加更多应用程序和更多版本时,我会得到一些愚蠢的应用程序,感觉就像糟糕的设计。
如何以更好的方式在Django中实现这一目标?或者至少,我怎样才能以更好的方式构建它? 我想为每个应用程序提供一些基础模型,然后每个版本继承,但这仍然会产生很多应用程序。
作为我的应用程序示例,它可能如下所示:
应用名称:App_v1_2012
模型
class Bag(models.Model)
name = models.CharField()
class Item(models.Model)
name = models.CharField()
in_bag = models.ForeignKey(Bag)
查看
class IndexView(generic.ListView):
model = Bag
template_name = 'sometemplate_2012.html'
应用名称:App_v1_2013
模型
class Bag(models.Model)
name = models.CharField()
class Item(models.Model)
name = models.CharField()
in_bag = models.ForeignKey(Bag)
查看
class IndexView(generic.ListView):
model = Bag
template_name = 'sometemplate_2013.html'
应用名称:App_v2_2014
模型
class Bag(models.Model)
bag_name = models.CharField()
owner = models.ForeignKey(User)
class Item(models.Model)
name = models.CharField()
in_bag = models.ForeignKey(Bag)
查看
class IndexView(generic.ListView):
model = Bag
template_name = 'sometemplate_2014.html'
如您所见,我最大的问题是违反DRY原则。所有内容都经过复制粘贴,但信息相同。
答案 0 :(得分:1)
为什么不从先前的应用程序导入模型和视图,就好像它们是库函数一样?您还可以从其他类继承并添加方法和属性,或在必要时覆盖它们。 Python有很多针对这些情况的OOP工具。
答案 1 :(得分:0)
我不确定django是否/如何支持符号链接,但是如果它按照这些方式执行一个方案(我使用与Google App Engine类似的东西)将有助于至少减少您需要管理的回购数量和克隆:
App1_v1
App2_v2
App2_v1
App3_v1
site.com/2012
App1_v1 -> ../../App1_v1
App2_v1 -> ../../App2_v1
site.com/2013
App1_v1 -> ../../App1_v1
App2_v2 -> ../../App2_v2
site.com/2014
App1_v1 -> ../../App1_v1
App2_v2 -> ../../App2_v2
App3_v1 -> ../../App3_v1