Джанго и архитектура: как разделить «референсную» базу данных между проектами? - PullRequest
5 голосов
/ 24 мая 2011

Я пришел сегодня с вопросом о дизайне / архитектуре, касающемся Джанго.

Я работаю на нескольких веб-сайтах (размещенных на одном сервере), которым по отдельности нужны географические данные (штаты, города и т. Д.). Каждый проект содержит приложения, и каждое приложение может содержать модели с полями ForeignKey для города или штата.

Чтобы не повторяться, я не хочу создавать базу данных для хранения этих городов и штатов и использовать ее в проектах Django .

Django предоставляет простой способ использовать несколько баз данных в одном проекте, объявив его в файле settings.py и записав классы маршрутизаторов для хранения материалов для чтения и записи. Но таким образом, невозможно использовать select_related выражение вроде:

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

Для меня это естественное поведение (невозможно объединить базы данных с нуля) ...

Мои вопросы:

  • Это хорошая идея рассмотреть вопрос о введении dblinks (я так не думаю ...) и может ли Django справиться с этим (я не нашел никаких документов для этой части)?
  • Как бы вы поступили, столкнувшись с такой ситуацией?

Быстрое и грязное решение состояло бы в том, чтобы импортировать все геоданные (города, штаты ...) в каждую базу данных проекта, но это вовсе не СУХОЙ :(:

python manage.py loaddata geo.json

Другое решение может заключаться в создании отдельного «гео» приложения, которое могло бы «обслуживать» (я не знаю, как) данные для других проектов ... На самом деле я пытался GeoDjango , но кажется, это действительно сложно, и, вероятно, не ответит на мой вопрос!

Заранее большое спасибо за ответы!

Ответы [ 2 ]

1 голос
/ 25 мая 2011

Вы можете создать представление базы данных для ввода статических данных из другой базы данных. Тогда ваша модель может указывать на это представление базы данных. Вы даже можете создавать объединения в представлении базы данных.

1 голос
/ 25 мая 2011

В зависимости от того, насколько статичны эти данные, самый простой способ может состоять в том, чтобы просто определить эти города и штаты в Python один раз, а затем импортировать это определение во все ваши отдельные проекты:

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

И тогда выможет вместо использования внешнего ключа использовать поле char, указывающее параметры 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)

Этот подход не очень прост в обновлении, и он не записывает отношения между городами и штатами (т.е. городв одном государстве), однако это очень просто.

...