Django和架构:如何在项目之间共享“参考”数据库?

时间:2011-05-24 19:22:51

标签: django database-design geodjango

我今天带来了关于Django的设计/架构问题。

我在多个网站上工作(托管在同一台服务器上),这些网站个别需要地理数据(州,城镇等)。每个项目都包含应用,每个应用可能包含带有ForeignKey字段到城镇或州的模型。

为了不重复自己,我不想建立一个数据库来存储这些城镇和州,并通过Django项目使用它

Django提供了一种直接的方式,可以在同一个项目中使用多个数据库,在settings.py文件中声明它并编写路由器类来保存读写内容。但就这样,不可能使用select_related语句,如:

job = get_object_or_404(Jobs.objects.select_related('state__town'), user=user)

这种行为对我来说很自然(不可能从头开始在数据库之间建立连接)......

我的问题:

  • 考虑引入 dblinks (我不这么认为......)是不是一个好主意,Django可以处理它(我没有找到这部分的任何文档)?
  • 面对这种情况,你会如何进行?

快速而肮脏的解决方案是在每个项目数据库中导入所有地理数据(城镇,州......),但它根本不是DRY :(:

python manage.py loaddata geo.json

另一种解决方案可能是建立一个单独的“地理”应用程序,它可以“服务”(我不知道如何)将数据传输到其他项目......实际上,我尝试了 GeoDjango ,但它似乎真的很复杂,它可能不会回答我的问题!

非常感谢您的答案!

2 个答案:

答案 0 :(得分:1)

根据这些数据的静态程度,最简单的方法可能是在Python中定义这些城镇和状态一次,然后在所有单独的项目中导入此定义:

# locations.py
STATES = (('S1', 'State 1'), ('S2', 'State 2'))
TOWNS = (('T1', 'Town 1'), ('T2', 'Town 2'))

然后您可以使用指定选项kwarg的字段而不是使用外键:

# app/models.py
from django.db import models
import locations # its on the path somewhere!

class MyModel(models.Model):
    state = models.CharField(max_length=5, options=STATES)
    town = models.CharField(max_length=5, options=TOWNS)

这种方法不是很容易更新,也没有记录城镇和州之间的关系(即一个城镇处于一个州),但它很简单。

答案 1 :(得分:1)

您可以创建数据库视图以从其他数据库引入静态数据。然后您的模型可以指向此数据库视图。您甚至可以在数据库视图中创建联接。

相关问题