﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
26739	Backward operation for RemoveField does not allow a default value in case the field is not null.	Gagaro	Priya	"If a field does not allow NULL and has no default, and this field is removed using RemoveField, the backward operation will break if the database is populated because the field will be created with no value.

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)
}}}

"	Bug	assigned	Migrations	dev	Normal			wkoot Bhuvnesh	Accepted	1	0	1	1	0	0
