一个项目中的多个不同版本的类似应用程序

时间:2015-07-14 17:05:08

标签: python django

我需要一些帮助来改进我建立的网站的架构。我想在单个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原则。所有内容都经过复制粘贴,但信息相同。

2 个答案:

答案 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