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.fields.related import do_pending_lookups | ||||
| from django.utils import six | ||||
| from django.utils.encoding import force_text | ||||
| 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): | ||||
|         self.app_label = app_label | ||||
|         self.name = name | ||||
|         self.name = force_text(name) | ||||
|         self.fields = fields | ||||
|         self.options = options or {} | ||||
|         self.bases = bases or (models.Model, ) | ||||
|   | ||||
| @@ -124,6 +124,8 @@ class MigrationWriter(object): | ||||
|                 dependencies.append("        migrations.swappable_dependency(settings.%s)," % dependency[1]) | ||||
|                 imports.add("from django.conf import settings") | ||||
|             else: | ||||
|                 # No need to output bytestrings for dependencies | ||||
|                 dependency = tuple([force_text(s) for s in dependency]) | ||||
|                 dependencies.append("        %s," % self.serialize(dependency)[0]) | ||||
|         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") | ||||
|         # Return basic info - other fields should override this. | ||||
|         return ( | ||||
|             self.name, | ||||
|             force_text(self.name, strings_only=True), | ||||
|             path, | ||||
|             [], | ||||
|             keywords, | ||||
|   | ||||
| @@ -1,6 +1,8 @@ | ||||
| import warnings | ||||
| from django.test import TestCase, override_settings | ||||
|  | ||||
| from django.db import models | ||||
| from django.test import TestCase, override_settings | ||||
| from django.utils import six | ||||
|  | ||||
|  | ||||
| class FieldDeconstructionTests(TestCase): | ||||
| @@ -15,14 +17,15 @@ class FieldDeconstructionTests(TestCase): | ||||
|         # First try using a "normal" field | ||||
|         field = models.CharField(max_length=65) | ||||
|         name, path, args, kwargs = field.deconstruct() | ||||
|         self.assertEqual(name, None) | ||||
|         self.assertIsNone(name) | ||||
|         field.set_attributes_from_name("is_awesome_test") | ||||
|         name, path, args, kwargs = field.deconstruct() | ||||
|         self.assertEqual(name, "is_awesome_test") | ||||
|         self.assertIsInstance(name, six.text_type) | ||||
|         # Now try with a ForeignKey | ||||
|         field = models.ForeignKey("some_fake.ModelName") | ||||
|         name, path, args, kwargs = field.deconstruct() | ||||
|         self.assertEqual(name, None) | ||||
|         self.assertIsNone(name) | ||||
|         field.set_attributes_from_name("author") | ||||
|         name, path, args, kwargs = field.deconstruct() | ||||
|         self.assertEqual(name, "author") | ||||
|   | ||||
		Reference in New Issue
	
	Block a user