Django - right way to join not-django tables

88 Views Asked by At

I have old cms database, structure isn't perfect and it can't be modified but i need to query using 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)

Please help me to create django models with right tables relationships. Should i use OneToOneField, ForeignKey, ManyToManyField and etc or pure join?

I'm trying to get Episodes from episode_post_relationship table with posts_text.posts_text and posts.some_other_col but can't specify that episode_post_relationship table should join posts_text on post_id and the same for posts table.

1

There are 1 best solutions below

2
On BEST ANSWER

As per documentation, you can connect to legacy Databases as well. For that, you need to connect your current Django project to that DB, for example, create a new project by django-admin.py startproject yourproject, then go to settings and update the DATABASES setup like this:

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',
    }
}

And then run python manage.py inspectdb. You can also output it as a model like python manage.py inspectdb > models.py

Update:

From what I can see, your DB should be:

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'

But, before you do anything with above relations, please make sure to have a backup of your current DB.