Как сделать так, чтобы два проекта django работали в одной базе данных
Мне нужно сделать два отдельных проекта Django в одной базе данных. В project_1
У меня есть модели, создающие объекты, которые мне нужно использовать в project_2
(в основном изображения).
Древовидная структура project_1_2
является:
project_1/
manage.py
settings.py
project_1_app1/
...
...
project_2/
manage.py
settings.py
project_2_app1/
...
...
Какой самый лучший подход?
РЕДАКТИРОВАТЬ: я использую sqlite3 в моей среде разработки.
Я хотел бы сохранить два моих проекта django как отдельные проекты (чтобы оба можно было безопасно обновить из соответствующих репозиториев).
# in project_1/settings.py
import os
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
..
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(PROJECT_ROOT, 'development.db'),
},
}
...
# in project_2/settings.py
import os
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
..
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(PROJECT_ROOT, 'development.db'),
},
}
...
Таким образом, каждый проект имеет свой development.db
(тот, которым мне нужно поделиться):
project_1/development.db
project_2/development.db
но я думаю, мне нужно сделать что-то еще, чтобы сделать его общим (и уникальным). Лучшее для меня было бы сохранить development.db
в project_1/ path и, таким образом, установите project_2/settings.py DATABASES
указать на project_1 / development.db.
1 ответ
Вы можете просто определить ту же базу данных в DATABASES
в ваших settings.py. Итак, если ваша база данных PostgreSQL, вы можете сделать что-то вроде этого:
# in project_1/settings.py
DATABASES = {
'default': {
'NAME': 'common_db',
'ENGINE': 'django.db.backends.postgresql',
'USER': 'project_1_user',
'PASSWORD': 'strong_password_1'
},
}
# in project_2/settings.py
DATABASES = {
'default': {
'NAME': 'common_db',
'ENGINE': 'django.db.backends.postgresql',
'USER': 'project_2_user',
'PASSWORD': 'strong_password_2'
},
}
Обратите внимание, что оба пользователя базы данных (project_1_user
а также project_2_user
) должны иметь соответствующие права доступа к базе данных, которую вы хотите использовать. Или вместо этого вы можете использовать одного и того же пользователя для обоих проектов.
Если вы хотите иметь более одной базы данных на проект, вам следует взглянуть на документы для нескольких баз данных.
С другой стороны, поскольку вы обмениваетесь данными, я полагаю, вы разделяете и функциональные возможности. Так, например, если project_1_app1
а также project_2_app1
делать то же самое (или аналогичные) вещи, кажется, что они могут быть одним приложением многократного использования.
редактировать
Поскольку вы используете sqlite3, вы должны убедиться, что вы используете тот же путь. Итак, предполагая, что project_1
а также project_2
это братья и сестры, вот так:
projects
project_1
settings.py
...
project_2
settings.py
...
Вы должны попробовать это:
# project_1/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(PROJECT_ROOT, 'development.db'),
},
}
# project_2/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(
os.path.dirname(os.path.dirname(PROJECT_ROOT)),
'project_1',
'development.db'
),
},
}
Это даст структуру, которую вы просите. Однако обратите внимание, что оба проекта не являются "автономными". project_2
явно зависит от project_1
База данных.
В любом случае, возможно, вам также следует взглянуть на модуль os.path для получения дополнительной информации.
Вам просто нужно объявить в своей модели в классе meta атрибут db_table с именем, отличным от имени app + model (которые автоматически генерируются Django), для двух проектов нужны одни и те же модели. перед запуском makemigrations и migrate.
class MyModel(models.Model):
class Meta:
db_table = 'MyModel'