Opened 3 hours ago

#36800 new Bug

Issue with ManyToManyField renaming

Reported by: Josik Owned by:
Component: Database layer (models, ORM) Version: 6.0
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

Since Django 6.0, using Postgres 16 database, when a ManyToManyField is renamed, it cannot be access anymore.

Models before field renaming:

from django.db import models


class Book(models.Model):
    title = models.CharField(max_length=200)


class Author(models.Model):
    name = models.CharField()
    books = models.ManyToManyField(Book)

In Postgres database I have the following table for the m2m relation my_app_author_books.

I then renamed the m2m field "books" to "volumes":

from django.db import models


class Book(models.Model):
    title = models.CharField(max_length=200)


class Author(models.Model):
    name = models.CharField()
    volumes = models.ManyToManyField(Book)

This generates the following migration:

# Generated by Django 6.0 on 2025-12-15 10:04

from django.db import migrations


class Migration(migrations.Migration):

    dependencies = [
        ('my_app', '0001_initial'),
    ]

    operations = [
        migrations.RenameField(
            model_name='author',
            old_name='books',
            new_name='volumes',
        ),
    ]

In Postgres database I still have the following table for the m2m relation my_app_author_books. The table was not renamed to my_app_author_volumes which was the case in Django 5.2.

Maybe this is a new behaviour but when I get all instances of volumes, in shell_plus:

author_instance.volumes.all()
gives

ProgrammingError: relation "my_app_author_volumes" does not exist
LINE 1: ...y_app_book"."title" FROM "my_app_book" INNER JOIN "my_app_au...

Migrations were played

python manage.py showmigrations gives:

my_app
 [X] 0001_initial
 [X] 0002_rename_books_author_volumes

Change History (0)

Note: See TracTickets for help on using tickets.
Back to Top