【问题标题】:Django and architecture : how to share a "referencial" database between projects?Django 和架构:如何在项目之间共享“参考”数据库?
【发布时间】:2011-05-25 14:52:55
【问题描述】:

我今天带着一个关于 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

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

非常感谢您的回答!

【问题讨论】:

    标签: django database-design geodjango


    【解决方案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)
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2011-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-02
        • 1970-01-01
        相关资源
        最近更新 更多