use*_*108 5 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)
Run Code Online (Sandbox Code Playgroud)
这种行为对我来说很自然(不可能从头开始在数据库之间进行连接)......
我的问题:
一个快速而肮脏的解决方案是在每个项目数据库中导入所有地理数据(城镇,州......),但它根本不是DRY :(:
python manage.py loaddata geo.json
Run Code Online (Sandbox Code Playgroud)
另一种解决方案可能是建立一个独立的"地理"应用程序,它可以"服务"(我不知道如何)将数据传输到其他项目......实际上,我尝试过GeoDjango,但它看起来真的很复杂,而且它可能不会回答我的问题!
非常感谢您的答案!
根据此数据的静态程度,最简单的方法可能是在 Python 中定义这些城镇和州一次,然后将此定义导入到所有单独的项目中:
# locations.py
STATES = (('S1', 'State 1'), ('S2', 'State 2'))
TOWNS = (('T1', 'Town 1'), ('T2', 'Town 2'))
Run Code Online (Sandbox Code Playgroud)
然后您可以使用指定选项 kwarg 的 charfield,而不是使用外键:
# 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)
Run Code Online (Sandbox Code Playgroud)
这种方法不太容易更新,并且它不记录城镇和州之间的关系(即一个城镇位于一个州),但它非常简单。
| 归档时间: |
|
| 查看次数: |
327 次 |
| 最近记录: |