2012-10-04 74 views
0

我有两个Django项目,我使用了很多通用模型。自定义用户类,算法类,产品类。这两个项目与电子商务有关,它们都运行在不同的机器上,并且服务于完全不同的目的。在多个项目中包含常见的Django项目

但是,考虑到他们在“常见”中有这些模型,我想知道是否值得创建第三个通用项目作为基础模型的“基础”,然后这两个项目项目会从这个基础项目导入通用模型。

这也将有所帮助,因为我们可以将这两个不同的客户和产品数据库从这两个电子商务网站加入到这个大型通用数据库中。

我的问题是: 1)有没有人有任何经验可能的开销或可以实际估计它?加入Django项目的共同部分将是必要的,但我估计在导入第三个项目(可能是实时的)时会有很多开销。

2)在第三个项目中导入最好的方法是什么?我能想到的多种方式:

  • 创建打包,安装Python模块,如互联网(setuptools的,LXML,tastypie)和导入该模块到两个Django的项目,在现有的;
  • 让项目坐在一台机器上的一个目录中,并在Python文件中实时导入该路径(之前做过,可以工作但似乎有一些开销);

编辑:我们的常见模型/功能,另外,包含贸易分泌和可获得的内容,因此公众分布是不可能的。我猜测路线是创建类似包的东西,但不是公开发布的,只分发和安装在2台特定的机器上。

有人可以对此提供一些反馈吗?

谢谢

回答

1

我会分离出常见的机型,等...到它自己的Python包。然后每个项目都会安装这个软件包,或者只是在系统级安装软件包,他们都可以使用它。如果你正确地处理这个问题,你不应该改变你的进口,你可以通过推送一个新的蛋到服务器并通过easy_installpip安装来轻松更新包装。

这是我现在有我的项目设置的方式。常见的非业务逻辑被分离到他们自己的项目中,我从中创建一个包,然后像其他任何python库一样安装和使用。

这里额外工作的一小部分可以为您节省大量时间,并允许在各种项目之间透明更新您的通用代码。

+0

这似乎是一个很好的解决方案。但是,我们在我们的共同材料中使用了商业秘密材料,因此无法公开访问。我们是否可以仅为所选机器创建和分配创建的模块? –

+1

是的,你可以在本地设置一个私人回购站,或者你可以从egg文件本身安装,你不需要上传到pypi。 – sean

0

将您的模型组织成单个项目中的逻辑应用程序。

例如一个项目有4个应用程序:

myproject/ 
    blog/ 
    contact/ 
    project1specific/ 
    project2specific/ 

使用站点框架: https://docs.djangoproject.com/en/dev/ref/contrib/sites/

有2个settings.py文件(settings_p1.py,settings_p2.py)

在每个设置文件中,将SITE_ID设置为每个项目的不同值。

SITE_ID = 1 (or 2 for the second project) 

不要忘了在您的网站表中实际创建第二个网站记录!

在每个settings.py中的INSTALLED_APPS中只包含要用于此特定项目的应用程序。

也许设置2个不同的模板目录,STATIC_ROOT(MEDIA_ROOT可能会保持不变),并在2个项目的设置文件中URL文件。

此时,您可以为每个项目settings.py使用不同的数据库设置,也可以将Site FK添加到模型中,并使AdminForms查询集仅反映当前的站点记录。

让我知道你是否需要任何细节,但这是我将如何完成你在做什么。

+0

感谢您提供深入的解决方案。问题是,这两个项目都很庞大。每个支持数千个活跃用户和类似的数千个产品。因此,每个项目已经有大约5-10个子模块。我认为将两个项目与其子模块合并成一个大项目会倒退,因为不是封装功能,而是以另一种方式进行封装? –

+0

是的,我的解决方案是我们为移动网站做的,当它与桌面版本松散耦合时,我们的解决方案却有足够的差异,需要2套应用程序/模板/网址。 –

0

如果您打算在可预见的未来并行支持这些应用程序,这是绝对值得的。除了对一件事做出改变,然后在另一个地方几乎逐字地重复它,没有什么比这更令人沮丧的了,尤其是如果奇怪的特定项目的错误开始出现,因为这两个错误仍然微妙地不同。

实现此类共享的一种方法可能是git submodules或felixge的Git Fake Submodules

相关问题