Replication:
models.py
{{{
class TestModel(Model):
field = CharField(max_length=255)
}}}
{{{
$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py shell
>>> TestModel.objects.create(field='test')
}}}
models.py
{{{
class TestModel(Model):
pass
}}}
{{{
$ python manage.py makemigrations
$ python manage migrate
$ python manage migrate app 0001
}}}
POC Patch made by apollo13 in IRC:
{{{
diff --git a/django/db/migrations/operations/fields.py
b/django/db/migrations/operations/fields.py
index 041f8a6..5604e36 100644
--- a/django/db/migrations/operations/fields.py
+++ b/django/db/migrations/operations/fields.py
@@ -122,6 +122,10 @@ class RemoveField(FieldOperation):
Removes a field from a model.
"""
+ def __init__(self, *args, **kwargs):
+ self.default = kwargs.pop('default', None)
+ super(RemoveField, self).__init__(*args, **kwargs)
+
def deconstruct(self):
kwargs = {
'model_name': self.model_name,
@@ -150,7 +154,12 @@ class RemoveField(FieldOperation):
to_model = to_state.apps.get_model(app_label, self.model_name)
if self.allow_migrate_model(schema_editor.connection.alias,
to_model):
from_model = from_state.apps.get_model(app_label,
self.model_name)
- schema_editor.add_field(from_model,
to_model._meta.get_field(self.name))
+ to_field = to_model._meta.get_field(self.name)
+ old_default = to_field.default
+ if self.default is not None:
+ to_field.default = self.default
+ schema_editor.add_field(from_model, to_field)
+ to_field.default = old_default
def describe(self):
return "Remove field %s from %s" % (self.name, self.model_name)
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/26739>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* needs_better_patch: => 0
* needs_docs: => 0
* needs_tests: => 0
* stage: Unreviewed => Accepted
Comment:
The autodetector should be updated to ask for a new default, tests and
docs missing.
--
Ticket URL: <https://code.djangoproject.com/ticket/26739#comment:1>
Comment (by charettes):
It would be great if we could also rely on the transient default of
`AddField` (`preserve_default=False`) if it has been provided.
e.g. default should not be required in this case
{{{#!python
operations = [
AddField('model', 'field', models.TextField(default='foo'),
preserve_default=False),
RemoveField('model', 'field'),
]
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/26739#comment:2>
* status: new => assigned
* owner: nobody => MarkusH
* has_patch: 0 => 1
Comment:
PR: https://github.com/django/django/pull/6870
--
Ticket URL: <https://code.djangoproject.com/ticket/26739#comment:3>
* needs_better_patch: 0 => 1
--
Ticket URL: <https://code.djangoproject.com/ticket/26739#comment:4>
* cc: wkoot (added)
--
Ticket URL: <https://code.djangoproject.com/ticket/26739#comment:5>
* cc: Bhuvnesh (added)
--
Ticket URL: <https://code.djangoproject.com/ticket/26739#comment:6>
* owner: Markus Holtermann => Bhuvnesh
--
Ticket URL: <https://code.djangoproject.com/ticket/26739#comment:7>
Comment (by Bhuvnesh):
[https://github.com/django/django/pull/16890 WIP PR]
--
Ticket URL: <https://code.djangoproject.com/ticket/26739#comment:8>
* needs_better_patch: 1 => 0
--
Ticket URL: <https://code.djangoproject.com/ticket/26739#comment:9>