[1.7.x] Fixed #22564 -- Prevented unneeded bytestrings in migrations
In some cases, this could lead to migrations written with Python 2
being incompatible with Python 3.
Thanks Tim Graham for the report and Loïc Bistuer for the advices.
Backport of da9cf53cb
from master.
This commit is contained in:
parent
e8f1395f4e
commit
0d138b9cf4
|
@ -6,6 +6,7 @@ from django.db import models
|
||||||
from django.db.models.options import DEFAULT_NAMES, normalize_together
|
from django.db.models.options import DEFAULT_NAMES, normalize_together
|
||||||
from django.db.models.fields.related import do_pending_lookups
|
from django.db.models.fields.related import do_pending_lookups
|
||||||
from django.utils import six
|
from django.utils import six
|
||||||
|
from django.utils.encoding import force_text
|
||||||
from django.utils.module_loading import import_string
|
from django.utils.module_loading import import_string
|
||||||
|
|
||||||
|
|
||||||
|
@ -132,7 +133,7 @@ class ModelState(object):
|
||||||
|
|
||||||
def __init__(self, app_label, name, fields, options=None, bases=None):
|
def __init__(self, app_label, name, fields, options=None, bases=None):
|
||||||
self.app_label = app_label
|
self.app_label = app_label
|
||||||
self.name = name
|
self.name = force_text(name)
|
||||||
self.fields = fields
|
self.fields = fields
|
||||||
self.options = options or {}
|
self.options = options or {}
|
||||||
self.bases = bases or (models.Model, )
|
self.bases = bases or (models.Model, )
|
||||||
|
|
|
@ -124,6 +124,8 @@ class MigrationWriter(object):
|
||||||
dependencies.append(" migrations.swappable_dependency(settings.%s)," % dependency[1])
|
dependencies.append(" migrations.swappable_dependency(settings.%s)," % dependency[1])
|
||||||
imports.add("from django.conf import settings")
|
imports.add("from django.conf import settings")
|
||||||
else:
|
else:
|
||||||
|
# No need to output bytestrings for dependencies
|
||||||
|
dependency = tuple([force_text(s) for s in dependency])
|
||||||
dependencies.append(" %s," % self.serialize(dependency)[0])
|
dependencies.append(" %s," % self.serialize(dependency)[0])
|
||||||
items["dependencies"] = "\n".join(dependencies) + "\n" if dependencies else ""
|
items["dependencies"] = "\n".join(dependencies) + "\n" if dependencies else ""
|
||||||
|
|
||||||
|
|
|
@ -370,7 +370,7 @@ class Field(RegisterLookupMixin):
|
||||||
path = path.replace("django.db.models.fields", "django.db.models")
|
path = path.replace("django.db.models.fields", "django.db.models")
|
||||||
# Return basic info - other fields should override this.
|
# Return basic info - other fields should override this.
|
||||||
return (
|
return (
|
||||||
self.name,
|
force_text(self.name, strings_only=True),
|
||||||
path,
|
path,
|
||||||
[],
|
[],
|
||||||
keywords,
|
keywords,
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
import warnings
|
import warnings
|
||||||
from django.test import TestCase, override_settings
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.test import TestCase, override_settings
|
||||||
|
from django.utils import six
|
||||||
|
|
||||||
|
|
||||||
class FieldDeconstructionTests(TestCase):
|
class FieldDeconstructionTests(TestCase):
|
||||||
|
@ -15,14 +17,15 @@ class FieldDeconstructionTests(TestCase):
|
||||||
# First try using a "normal" field
|
# First try using a "normal" field
|
||||||
field = models.CharField(max_length=65)
|
field = models.CharField(max_length=65)
|
||||||
name, path, args, kwargs = field.deconstruct()
|
name, path, args, kwargs = field.deconstruct()
|
||||||
self.assertEqual(name, None)
|
self.assertIsNone(name)
|
||||||
field.set_attributes_from_name("is_awesome_test")
|
field.set_attributes_from_name("is_awesome_test")
|
||||||
name, path, args, kwargs = field.deconstruct()
|
name, path, args, kwargs = field.deconstruct()
|
||||||
self.assertEqual(name, "is_awesome_test")
|
self.assertEqual(name, "is_awesome_test")
|
||||||
|
self.assertIsInstance(name, six.text_type)
|
||||||
# Now try with a ForeignKey
|
# Now try with a ForeignKey
|
||||||
field = models.ForeignKey("some_fake.ModelName")
|
field = models.ForeignKey("some_fake.ModelName")
|
||||||
name, path, args, kwargs = field.deconstruct()
|
name, path, args, kwargs = field.deconstruct()
|
||||||
self.assertEqual(name, None)
|
self.assertIsNone(name)
|
||||||
field.set_attributes_from_name("author")
|
field.set_attributes_from_name("author")
|
||||||
name, path, args, kwargs = field.deconstruct()
|
name, path, args, kwargs = field.deconstruct()
|
||||||
self.assertEqual(name, "author")
|
self.assertEqual(name, "author")
|
||||||
|
|
Loading…
Reference in New Issue