#33019: makemigrations produces invalid import path in migration file
--------------------------------+--------------------------------------
     Reporter:  zepx            |                    Owner:  nobody
         Type:  Bug             |                   Status:  new
    Component:  Migrations      |                  Version:  3.2
     Severity:  Normal          |               Resolution:
     Keywords:  makemigrations  |             Triage Stage:  Unreviewed
    Has patch:  0               |      Needs documentation:  0
  Needs tests:  0               |  Patch needs improvement:  0
Easy pickings:  0               |                    UI/UX:  0
--------------------------------+--------------------------------------
Description changed by zepx:

Old description:

> This issue is somewhat similar to
> https://code.djangoproject.com/ticket/27914 with a slightly different
> problem.
>
> If you define an inner class in the `django.db.models.Model` subclass,
> `makemigrations` will produce an invalid import path resulting in import
> error.
>
> Specifically, if we have the following structure in our `models.py`,
>
> {{{#!python
> from django.db import models
>

> class OuterClass(models.Model):
>     class InnerField(models.CharField):
>         pass
>
>     outer_field = InnerField(max_length=100)
> }}}
>
> the generated migration file would produce
>
> {{{#!python
> # Generated by Django 3.2.6 on 2021-08-13 03:39
>
> from django.db import migrations, models
> import test1.models.OuterClass
>

> class Migration(migrations.Migration):
>
>     initial = True
>
>     dependencies = [
>     ]
>
>     operations = [
>         migrations.CreateModel(
>             name='OuterClass',
>             fields=[
>                 ('id', models.BigAutoField(auto_created=True,
> primary_key=True, serialize=False, verbose_name='ID')),
>                 ('outer_field',
> test1.models.OuterClass.InnerField(max_length=100)),
>             ],
>         ),
>     ]
> }}}
>
> Notice that the import path at the top refers to an import of a class.
> This is an invalid import format.
>
> {{{#!python
> import test1.models.OuterClass
> }}}
>
> Further usage of `manage.py migrate` will result in errors:
>
> {{{#!python
> ModuleNotFoundError: No module named 'test1.models.OuterClass';
> 'test1.models' is not a package
> }}}

New description:

 This issue is somewhat similar to
 https://code.djangoproject.com/ticket/27914 with a slightly different
 problem.

 If you define an inner class in the `django.db.models.Model` subclass,
 `makemigrations` will produce an invalid import path resulting in import
 error.

 Specifically, if we have the following structure in our `models.py`,

 {{{#!python
 from django.db import models


 class OuterClass(models.Model):
     class InnerField(models.CharField):
         pass

     outer_field = InnerField(max_length=100)
 }}}

 the generated migration file would produce

 {{{#!python
 # Generated by Django 3.2.6 on 2021-08-13 03:39

 from django.db import migrations, models
 import test1.models.OuterClass


 class Migration(migrations.Migration):

     initial = True

     dependencies = [
     ]

     operations = [
         migrations.CreateModel(
             name='OuterClass',
             fields=[
                 ('id', models.BigAutoField(auto_created=True,
 primary_key=True, serialize=False, verbose_name='ID')),
                 ('outer_field',
 test1.models.OuterClass.InnerField(max_length=100)),
             ],
         ),
     ]
 }}}

 Notice that the import path at the top refers to an import of a class.
 This is an invalid import format.

 {{{#!python
 import test1.models.OuterClass
 }}}

 Further usage of `manage.py migrate` will result in errors:

 {{{#!python
 ModuleNotFoundError: No module named 'test1.models.OuterClass';
 'test1.models' is not a package
 }}}

 If we change the import to

 {{{#!python
 import test1.models
 }}}

 the migration file will work accordingly.

--

-- 
Ticket URL: <https://code.djangoproject.com/ticket/33019#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/062.53cd622e7f380db738a0b8de6d6f86ba%40djangoproject.com.

Reply via email to