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'

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

Другие вопросы по тегам