Django - 加入非 Django 表的正确方法

Django - right way to join not-django tables

我有旧的 cms 数据库,结构不完善,无法修改,但我需要使用 django 进行查询

TABLE posts (post_id)

TABLE posts_text (post_id, post_text)

TABLE episode (id, season_id, episode_name)

TABLE episode_post_relationship (id, season_id, episode_id, post_id)

请帮助我创建具有正确 table 关系的 Django 模型。我应该使用 OneToOneField、ForeignKey、ManyToManyField 等还是纯连接?

我正在尝试使用 posts_textepisode_post_relationship table 中获取 剧集 posts_textposts.some_other_col 但不能指定 episode_post_relationship table 应该在 post_id 上加入 posts_text 并且 posts table.

也是如此

作为 per documentation,您也可以连接到遗留数据库。为此,您需要将当前的 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'

但是,在您对上述关系进行任何操作之前,请确保备份您当前的数据库。