#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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/062.53cd622e7f380db738a0b8de6d6f86ba%40djangoproject.com.

Reply via email to