mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[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:
		| @@ -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") | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user