[Django] #23521: removal of concrete Model from bases doesn't remove it from ModelState bases

68 views
Skip to first unread message

Django

unread,
Sep 18, 2014, 3:18:04 PM9/18/14
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
-------------------------------+------------------------
Reporter: sir-sigurd | Owner: sir-sigurd
Type: Uncategorized | Status: new
Component: Uncategorized | Version: 1.7
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------+------------------------
Steps to reproduce:

* add `test` app with `models.py`:
{{{
class Thing(models.Model):
pass


class SuperThing(Thing):
pass
}}}

* do

{{{
manage.py makemigrations test
}}}


* change `models.py`:
{{{
class SuperThing(models.Model):
thing_ptr = models.AutoField(primary_key=True)
}}}

* do

{{{
manage.py makemigrations test
}}}

* do it one more time

{{{
manage.py makemigrations test
}}}

last command results in


{{{
django.db.migrations.state.InvalidBasesError: Cannot resolve bases for
[<ModelState: 'test.SuperThing'>]
This can happen if you are inheriting models from an app with migrations
(e.g. contrib.auth)
in an app with no migrations; see
https://docs.djangoproject.com/en/1.7/topics/migrations/#dependencies for
more
}}}

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

Django

unread,
Sep 18, 2014, 3:28:07 PM9/18/14
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
----------------------------+--------------------------------------
Reporter: sir-sigurd | Owner: sir-sigurd
Type: Bug | Status: new
Component: Migrations | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
----------------------------+--------------------------------------
Changes (by sir-sigurd):

* needs_docs: => 0
* type: Uncategorized => Bug
* component: Uncategorized => Migrations
* needs_tests: => 0
* needs_better_patch: => 0


--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:1>

Django

unread,
Sep 20, 2014, 6:05:33 AM9/20/14
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
----------------------------+--------------------------------------
Reporter: sir-sigurd | Owner: sir-sigurd

Type: Bug | Status: new
Component: Migrations | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Unreviewed

Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
----------------------------+--------------------------------------

Comment (by bmispelon):

Hi,

I can't reproduce the issue you're describing.

On master, the second `makemigrations` doesn't detect any changes.
On `stable/1.7.x`, it does create a migration but running it a third time
works (and detects no change as expected).

As a side note, it's not possible to create an app called `test` because
you get this error when doing `manage.py startapp test`:

> CommandError: 'test' conflicts with the name of an existing Python
module and cannot be used as an app name. Please try another name.


Can you provide us with some details on how you're trigerring the issue?

Thanks.

--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:2>

Django

unread,
Sep 20, 2014, 6:27:15 AM9/20/14
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
----------------------------+--------------------------------------
Reporter: sir-sigurd | Owner: sir-sigurd

Type: Bug | Status: new
Component: Migrations | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Unreviewed

Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
----------------------------+--------------------------------------

Comment (by sir-sigurd):

Replying to [comment:2 bmispelon]:


Hi,

Probably this is not obvious, but removal of `Thing` model from
`models.py`, not only from `SuperThing` bases was implied.

[[BR]]


> As a side note, it's not possible to create an app called `test` because
you get this error when doing `manage.py startapp test`

I have never used this for creating apps =)

--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:3>

Django

unread,
Sep 20, 2014, 6:35:35 AM9/20/14
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
----------------------------+--------------------------------------
Reporter: sir-sigurd | Owner: sir-sigurd

Type: Bug | Status: new
Component: Migrations | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted

Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
----------------------------+--------------------------------------
Changes (by bmispelon):

* stage: Unreviewed => Accepted


Comment:

Thanks, that's the bit I was missing.

--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:4>

Django

unread,
Sep 20, 2014, 11:25:11 AM9/20/14
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
----------------------------+--------------------------------------
Reporter: sir-sigurd | Owner: sir-sigurd

Type: Bug | Status: new
Component: Migrations | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
----------------------------+--------------------------------------
Changes (by Markush2010):

* cc: info+coding@… (added)


Old description:

> Steps to reproduce:
>
> * add `test` app with `models.py`:
> {{{
> class Thing(models.Model):
> pass
>

> class SuperThing(Thing):
> pass
> }}}
>
> * do
>
> {{{
> manage.py makemigrations test
> }}}
>

> * change `models.py`:
> {{{
> class SuperThing(models.Model):
> thing_ptr = models.AutoField(primary_key=True)
> }}}
>
> * do
>
> {{{
> manage.py makemigrations test
> }}}
>
> * do it one more time
>
> {{{
> manage.py makemigrations test
> }}}
>
> last command results in
>

> {{{
> django.db.migrations.state.InvalidBasesError: Cannot resolve bases for
> [<ModelState: 'test.SuperThing'>]
> This can happen if you are inheriting models from an app with migrations
> (e.g. contrib.auth)
> in an app with no migrations; see
> https://docs.djangoproject.com/en/1.7/topics/migrations/#dependencies for
> more
> }}}

New description:

Steps to reproduce:

* add `test` app with `models.py`:
{{{
class Thing(models.Model):
pass


class SuperThing(Thing):
pass
}}}

* do

{{{
manage.py makemigrations test
}}}


* change `models.py` (remove `Thing`):


{{{
class SuperThing(models.Model):
thing_ptr = models.AutoField(primary_key=True)
}}}

* do

{{{
manage.py makemigrations test
}}}

* do it one more time

{{{
manage.py makemigrations test
}}}

last command results in


{{{
django.db.migrations.state.InvalidBasesError: Cannot resolve bases for
[<ModelState: 'test.SuperThing'>]
This can happen if you are inheriting models from an app with migrations
(e.g. contrib.auth)
in an app with no migrations; see
https://docs.djangoproject.com/en/1.7/topics/migrations/#dependencies for
more
}}}

--

--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:5>

Django

unread,
Sep 21, 2014, 7:13:03 AM9/21/14
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
----------------------------+--------------------------------------
Reporter: sir-sigurd | Owner: sir-sigurd

Type: Bug | Status: new
Component: Migrations | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
----------------------------+--------------------------------------

Comment (by Markush2010):

Are you working on a patch sir-sigurd? If not, I'd write one.

--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:6>

Django

unread,
Sep 21, 2014, 7:15:06 AM9/21/14
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
----------------------------+--------------------------------------
Reporter: sir-sigurd | Owner: sir-sigurd

Type: Bug | Status: new
Component: Migrations | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
----------------------------+--------------------------------------

Comment (by sir-sigurd):

Replying to [comment:6 Markush2010]:


> Are you working on a patch sir-sigurd? If not, I'd write one.

Yes, I'm working on it.

--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:7>

Django

unread,
Sep 28, 2014, 4:57:24 AM9/28/14
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
----------------------------+--------------------------------------
Reporter: sir-sigurd | Owner: sir-sigurd

Type: Bug | Status: new
Component: Migrations | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
----------------------------+--------------------------------------

Comment (by yuvadm):

There's an easier way to reproduce what seems to be the exact same error:

* Create a `BaseModel` and a `SubModel` that inherits from it
* Run `makemigrations` and `migrate` to add both models to database
* Delete both models together
* Run `makemigrations` and `migrate` to delete both models from the
database

The same error should now appear.

--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:8>

Django

unread,
Nov 15, 2014, 6:54:09 AM11/15/14
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
----------------------------+--------------------------------------
Reporter: sir-sigurd | Owner: sir-sigurd

Type: Bug | Status: new
Component: Migrations | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
----------------------------+--------------------------------------

Comment (by ris):

I invite you all to look at my marked-as-duplicate bug #23818. To me it
seems there is simply no way for django's migration operations to express
a change of {{{bases}}}. {{{parent_link}}}s are created & removed, but the
built-up in-memory representation of the models never understands the new
parentage, meaning certain operations (e.g. in a RunPython operation) will
simply not work right when referring to inherited fields. This goes beyond
{{{makemigrations}}} simply not detecting a change.

--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:9>

Django

unread,
Nov 15, 2014, 7:39:17 AM11/15/14
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
----------------------------+--------------------------------------
Reporter: sir-sigurd | Owner: sir-sigurd

Type: Bug | Status: new
Component: Migrations | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
----------------------------+--------------------------------------
Changes (by ris):

* cc: bugs@… (added)


--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:10>

Django

unread,
Nov 11, 2015, 4:23:48 AM11/11/15
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
----------------------------+--------------------------------------
Reporter: sir-sigurd | Owner: sir-sigurd
Type: Bug | Status: assigned

Component: Migrations | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
----------------------------+--------------------------------------
Changes (by sir-sigurd):

* status: new => assigned


--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:11>

Django

unread,
Nov 11, 2015, 4:23:55 AM11/11/15
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
----------------------------+------------------------------------
Reporter: sir-sigurd | Owner:
Type: Bug | Status: new

Component: Migrations | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
----------------------------+------------------------------------
Changes (by sir-sigurd):

* owner: sir-sigurd =>
* status: assigned => new


--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:12>

Django

unread,
Jan 8, 2016, 11:48:36 AM1/8/16
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
----------------------------+------------------------------------
Reporter: sir-sigurd | Owner:
Type: Bug | Status: new
Component: Migrations | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
----------------------------+------------------------------------
Changes (by crearc):

* cc: ericmills2@… (added)


Comment:

This bug has burned me pretty bad. I was working through steps to switch
from concrete inheritance to abstract inheritance. Is someone going to
revisit this?

--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:13>

Django

unread,
Apr 11, 2016, 9:56:33 AM4/11/16
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
----------------------------+------------------------------------
Reporter: sir-sigurd | Owner:
Type: Bug | Status: new
Component: Migrations | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
----------------------------+------------------------------------

Comment (by timgraham):

#23521 may be related or a duplicate.

--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:14>

Django

unread,
Apr 17, 2016, 11:33:43 PM4/17/16
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
----------------------------+------------------------------------
Reporter: sir-sigurd | Owner:
Type: Bug | Status: new
Component: Migrations | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
----------------------------+------------------------------------

Comment (by jmfederico):

Having the same issue.
I had to manually alter my initial migration and remove the offending base
class for my app to work.

--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:15>

Django

unread,
Dec 14, 2016, 5:02:38 AM12/14/16
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
-------------------------------------+-------------------------------------
Reporter: Sergey Fedoseev | Owner: Sergey
| Fedoseev

Type: Bug | Status: new
Component: Migrations | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------

Comment (by rm_):

I had the need as described in #23818 but instead of squashing migrations
i've created a migrations operator to update the bases on migrations
models state. This works fine for me on django 1.8. I still haven't tested
if django master behaves differently. Do you think this is a valuable
addition to django?

{{{
class AlterBaseOperation(Operation):
reduce_to_sql = False
reversible = True

def __init__(self, model_name, bases, prev_bases):
self.model_name = model_name
self.bases = bases
self.prev_bases = prev_bases

def state_forwards(self, app_label, state):
state.models[app_label, self.model_name].bases = self.bases
state.reload_model(app_label, self.model_name)

def state_backwards(self, app_label, state):
state.models[app_label, self.model_name].bases = self.prev_bases
state.reload_model(app_label, self.model_name)

def database_forwards(self, app_label, schema_editor, from_state,
to_state):
pass

def database_backwards(self, app_label, schema_editor, from_state,
to_state):
pass

def describe(self):
return "Update %s bases to %s" % (self.model_name, self.bases)
}}}

--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:16>

Django

unread,
Mar 29, 2017, 2:31:24 AM3/29/17
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
-------------------------------------+-------------------------------------
Reporter: Sergey Fedoseev | Owner: Sergey
| Fedoseev
Type: Bug | Status: assigned

Component: Migrations | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Sergey Fedoseev):

* status: new => assigned


--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:17>

Django

unread,
Mar 29, 2017, 2:31:36 AM3/29/17
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
---------------------------------+------------------------------------
Reporter: Sergey Fedoseev | Owner: (none)
Type: Bug | Status: new

Component: Migrations | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
---------------------------------+------------------------------------
Changes (by Sergey Fedoseev):

* status: assigned => new
* owner: Sergey Fedoseev => (none)


--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:18>

Django

unread,
Feb 27, 2019, 3:37:18 AM2/27/19
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
---------------------------------+------------------------------------
Reporter: Sergey Fedoseev | Owner: (none)
Type: Bug | Status: new
Component: Migrations | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
---------------------------------+------------------------------------
Changes (by Charlie Denton):

* cc: Charlie Denton (added)


--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:19>

Django

unread,
Apr 13, 2019, 7:20:36 AM4/13/19
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
---------------------------------+------------------------------------
Reporter: Sergey Fedoseev | Owner: (none)
Type: Bug | Status: new
Component: Migrations | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
---------------------------------+------------------------------------
Changes (by Ian Foote):

* cc: Ian Foote (added)


--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:20>

Django

unread,
Apr 13, 2019, 8:37:06 AM4/13/19
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
---------------------------------+-------------------------------------
Reporter: Sergey Fedoseev | Owner: Ian Foote
Type: Bug | Status: assigned

Component: Migrations | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
---------------------------------+-------------------------------------
Changes (by Ian Foote):

* owner: (none) => Ian Foote


* status: new => assigned


--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:21>

Django

unread,
Apr 14, 2019, 7:03:17 AM4/14/19
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
---------------------------------+-------------------------------------
Reporter: Sergey Fedoseev | Owner: Ian Foote
Type: Bug | Status: assigned
Component: Migrations | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
---------------------------------+-------------------------------------
Changes (by Ian Foote):

* has_patch: 0 => 1


--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:22>

Django

unread,
May 20, 2019, 9:05:55 AM5/20/19
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
---------------------------------+-------------------------------------
Reporter: Sergey Fedoseev | Owner: Ian Foote
Type: Bug | Status: assigned
Component: Migrations | Version: master

Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 1

Easy pickings: 0 | UI/UX: 0
---------------------------------+-------------------------------------
Changes (by felixxm):

* needs_better_patch: 0 => 1
* version: 1.7 => master


--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:23>

Django

unread,
May 27, 2019, 9:52:36 AM5/27/19
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
---------------------------------+-------------------------------------
Reporter: Sergey Fedoseev | Owner: Ian Foote
Type: Bug | Status: assigned
Component: Migrations | Version: master
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 1
Easy pickings: 0 | UI/UX: 0
---------------------------------+-------------------------------------

Comment (by felixxm):

Another use case of `migrations.AlterModelBases()` is described in #30513.

--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:24>

Django

unread,
Jul 15, 2019, 6:43:36 AM7/15/19
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
---------------------------------+-------------------------------------
Reporter: Sergey Fedoseev | Owner: Ian Foote
Type: Bug | Status: assigned
Component: Migrations | Version: master
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 1
Easy pickings: 0 | UI/UX: 0
---------------------------------+-------------------------------------
Changes (by Daniel Rios):

* cc: Daniel Rios (added)


--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:25>

Django

unread,
Oct 25, 2019, 8:20:09 AM10/25/19
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
---------------------------------+-------------------------------------
Reporter: Sergey Fedoseev | Owner: Ian Foote
Type: Bug | Status: assigned
Component: Migrations | Version: master
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 1
Easy pickings: 0 | UI/UX: 0
---------------------------------+-------------------------------------

Comment (by Karolis Ryselis):

There is one more case that needs to be addressed related to bases in
migrations.

**Step 1:**
Consider this model:
{{{
class Good(GoodServiceBase):
title = models.CharField(max_length=16)
}}}
this creates migration with the following operation:

{{{
migrations.CreateModel(
name='Good',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True,
serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=16)),
],
),
}}}

**Step 2:**
Then we add a new model and change existing model to inherit from the new
model.

{{{
class GoodServiceBase(models.Model):
active = models.BooleanField(default=True)

class Good(GoodServiceBase):
title = models.CharField(max_length=16)
}}}

This generates migration like this:
{{{
migrations.CreateModel(
name='GoodServiceBase',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True,
serialize=False, verbose_name='ID')),
('active', models.BooleanField(default=True)),
],
),
migrations.RemoveField(
model_name='good',
name='id',
),
migrations.AddField(
model_name='good',
name='goodservicebase_ptr',
field=models.OneToOneField(auto_created=True, default=1,
on_delete=django.db.models.deletion.CASCADE, parent_link=True,
primary_key=True, serialize=False, to='goods.GoodServiceBase'),
preserve_default=False,
),
}}}

If we have no data in database, this will pass.

**Step 3 with crash:**
Try to access field {{{active}}} in datamigration and migration crashes.
Operation in migration to reproduce this:
{{{
def migrate_my_data(apps, schema_editor):
for good in apps.get_model("goods", "Good").objects.all():
print(good.active)

migrations.RunPython(migrate_my_data, reverse_code=lambda x, y: None)
}}}

This crashes with the error:
{{{
<...>
File "<project home>/goods/migrations/0003_auto_20191025_1157.py", line 8,
in migrate_my_data
print(good.active)
AttributeError: 'Good' object has no attribute 'active'
}}}

As far as I understand this happens because {{{bases}}} is not altered in
migration and fake models do not inherit fields from their true parent
models. Thus, currently if we change inheritance chain of existing models,
we lose the ability to use those models in data migrations.

Tested in version 2.2.6.

--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:26>

Django

unread,
Mar 2, 2020, 9:30:30 AM3/2/20
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
---------------------------------+-------------------------------------
Reporter: Sergey Fedoseev | Owner: Ian Foote
Type: Bug | Status: assigned
Component: Migrations | Version: master
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 1
Easy pickings: 0 | UI/UX: 0
---------------------------------+-------------------------------------

Comment (by felixxm):

Another two duplicates: #31329 and #26488.

--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:27>

Django

unread,
Mar 6, 2020, 5:41:23 AM3/6/20
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
---------------------------------+-------------------------------------
Reporter: Sergey Fedoseev | Owner: Ian Foote
Type: Bug | Status: assigned
Component: Migrations | Version: master
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 1
Easy pickings: 0 | UI/UX: 0
---------------------------------+-------------------------------------

Comment (by felixxm):

Another use case is described in #31343.

--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:28>

Django

unread,
May 11, 2020, 4:40:56 PM5/11/20
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
---------------------------------+------------------------------------
Reporter: Sergey Fedoseev | Owner: (none)
Type: Bug | Status: new
Component: Migrations | Version: master
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 1
Easy pickings: 0 | UI/UX: 0
---------------------------------+------------------------------------
Changes (by Ian Foote):

* owner: Ian Foote => (none)


* status: assigned => new


Comment:

Deassigning because I don't think I'm likely to get to this again in the
near future and I'd be happy for someone else to take my work and finish
the job.

--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:29>

Django

unread,
May 13, 2020, 2:37:36 AM5/13/20
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
---------------------------------+------------------------------------
Reporter: Sergey Fedoseev | Owner: (none)
Type: Bug | Status: new
Component: Migrations | Version: master
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 1
Easy pickings: 0 | UI/UX: 0
---------------------------------+------------------------------------
Changes (by Sardorbek Imomaliev):

* cc: Sardorbek Imomaliev (added)


--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:30>

Django

unread,
Jun 3, 2020, 5:43:55 PM6/3/20
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
---------------------------------+------------------------------------
Reporter: Sergey Fedoseev | Owner: Zorking
Type: Bug | Status: assigned

Component: Migrations | Version: master
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 1
Easy pickings: 0 | UI/UX: 0
---------------------------------+------------------------------------
Changes (by Zorking):

* owner: (none) => Zorking


* status: new => assigned


--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:31>

Django

unread,
Jan 7, 2021, 9:35:40 AM1/7/21
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
-------------------------------------+-------------------------------------
Reporter: Sergey Fedoseev | Owner: Vadim
| Fabrichnov

Type: Bug | Status: assigned
Component: Migrations | Version: master
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Vadim Fabrichnov):

* needs_better_patch: 1 => 0


--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:32>

Django

unread,
Jan 19, 2021, 1:28:37 AM1/19/21
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
-------------------------------------+-------------------------------------
Reporter: Sergey Fedoseev | Owner: Vadim
| Fabrichnov
Type: Bug | Status: assigned
Component: Migrations | Version: master
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 1 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Mariusz Felisiak):

* needs_tests: 0 => 1


--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:33>

Django

unread,
Mar 15, 2024, 5:11:47 PMMar 15
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
---------------------------------+------------------------------------
Reporter: Sergey Fedoseev | Owner: Tom L.
Type: Bug | Status: assigned
Component: Migrations | Version: dev
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 1 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
---------------------------------+------------------------------------
Changes (by Tom L.):

* owner: Vadim Fabrichnov => Tom L.

--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:34>

Django

unread,
Mar 16, 2024, 6:21:51 AMMar 16
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
---------------------------------+------------------------------------
Reporter: Sergey Fedoseev | Owner: Tom L.
Type: Bug | Status: assigned
Component: Migrations | Version: dev
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
---------------------------------+------------------------------------
Changes (by Tom L.):

* needs_tests: 1 => 0

--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:35>

Django

unread,
Mar 18, 2024, 5:22:01 AMMar 18
to django-...@googlegroups.com
#23521: removal of concrete Model from bases doesn't remove it from ModelState
bases
---------------------------------+------------------------------------
Reporter: Sergey Fedoseev | Owner: Tom L.
Type: Bug | Status: assigned
Component: Migrations | Version: dev
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 1
Easy pickings: 0 | UI/UX: 0
---------------------------------+------------------------------------
Changes (by Mariusz Felisiak):

* needs_better_patch: 0 => 1

--
Ticket URL: <https://code.djangoproject.com/ticket/23521#comment:36>
Reply all
Reply to author
Forward
0 new messages