Django - правильный способ объединения не-джанго столов - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть старая база данных cms, структура не идеальна и ее нельзя изменить, но мне нужно выполнить запрос, используя django

TABLE posts (post_id)

TABLEposts_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 Ответ

0 голосов
/ 23 ноября 2018

Как в документации , вы также можете подключаться к устаревшим базам данных.Для этого вам нужно подключить ваш текущий проект 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'

Но, прежде чем делать что-либо с вышеуказанными отношениями, убедитесь, что у вас есть резервная копия вашей текущей БД.

...