Django - правильный способ объединения не-джанго столов
У меня есть старая база данных cms, структура не идеальна и не может быть изменена, но мне нужно сделать запрос, используя django
ТАБЛИЦА posts
(post_id
)
ТАБЛИЦА posts_text
(post_id
, post_text
)
ТАБЛИЦА episode
(id
, season_id
, episode_name
)
ТАБЛИЦА episode_post_relationship
(id
, season_id
, episode_id
, post_id
)
Пожалуйста, помогите мне создать модели Django с правильными связями таблиц. Должен ли я использовать OneToOneField, ForeignKey, ManyToManyField и т. Д. Или чистое соединение?
Я пытаюсь получить Эпизоды из таблицы episode_post_relationship с posts_text
,posts_text
а также posts
,some_other_col
но не могу указать, что episode_post_relationship
стол должен присоединиться posts_text
на post_id
и то же самое для posts
Таблица.
1 ответ
Согласно документации, вы также можете подключиться к устаревшим базам данных. Для этого вам нужно подключить ваш текущий проект Django к этой БД, например, создать новый проект с помощью django-admin.py startproject yourproject
, затем перейдите в настройки и обновите DATABASES
настроить как это:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'DB_NAME',
'USER': 'DB_USER',
'PASSWORD': 'DB_PASSWORD',
'HOST': 'localhost', # Or an IP Address that your DB is hosted on
'PORT': '3306',
}
}
А потом беги python manage.py inspectdb
, Вы также можете вывести его как модель, как python manage.py inspectdb > models.py
Обновить:
Из того, что я вижу, ваша БД должна быть:
class Post(models.Model):
post_id = models.AutoField(primary_key=True)
class Meta:
db_table = 'posts'
class PostText(models.Model):
post = models.ForeignKey(Post)
post_text = models.TextField()
class Meta:
db_table = 'posts_text'
class Season(models.Model):
# season fields
class Meta:
db_table = 'season'
class Episode(models.Model):
season = models.ForeignKey(Season)
episode_name = models.CharField(max_length=255) # depends on your DB
posts = models.ManyToManyField(Post, through="EpisodePost")
class Meta:
db_table='episode'
class EpisodePost(models.Model):
season = models.ForeignKey(Season)
episode = models.ForeignKey(Episode)
post = models.ForeignKey(Post)
class Meta:
db_table='episode_post_relationship'
Но, прежде чем делать что-либо с вышеуказанными отношениями, пожалуйста, убедитесь, что у вас есть резервная копия вашей текущей БД.