From 0a8b911582eee85ea6da0d40dd2c7b12de5a78b2 Mon Sep 17 00:00:00 2001 From: Carl Meyer Date: Thu, 11 Dec 2014 17:28:03 -0700 Subject: [PATCH] [1.7.x] Fixed #23455 -- Accept either bytes or text for related_name, convert to text. Backport of c72eb80d114fb5d90bd21b5549e8abd0bbd17f99 from master. --- django/db/models/fields/related.py | 4 ++-- docs/releases/1.7.2.txt | 6 +++--- tests/model_fields/models.py | 2 +- tests/model_fields/tests.py | 4 ++++ 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index bb877c214b0..344b238de85 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -14,7 +14,7 @@ from django.db.models.lookups import IsNull from django.db.models.related import RelatedObject, PathInfo from django.db.models.query import QuerySet from django.db.models.sql.datastructures import Col -from django.utils.encoding import smart_text +from django.utils.encoding import force_text, smart_text from django.utils import six from django.utils.deprecation import RenameMethodsBase, RemovedInDjango18Warning from django.utils.translation import ugettext_lazy as _ @@ -259,7 +259,7 @@ class RelatedField(Field): sup.contribute_to_class(cls, name, virtual_only=virtual_only) if not cls._meta.abstract and self.rel.related_name: - related_name = self.rel.related_name % { + related_name = force_text(self.rel.related_name) % { 'class': cls.__name__.lower(), 'app_label': cls._meta.app_label.lower() } diff --git a/docs/releases/1.7.2.txt b/docs/releases/1.7.2.txt index 0f1483e18e4..30e1c8fc499 100644 --- a/docs/releases/1.7.2.txt +++ b/docs/releases/1.7.2.txt @@ -125,6 +125,6 @@ Bugfixes * Fixed a crash in the admin when using "Save as new" and also deleting a related inline (:ticket:`23857`). -* Removed auto-conversion of ``related_name`` to unicode in field - deconstruction, to maintain consistency of bytes/text in migrations matching - the original values (:ticket:`23455` and :ticket:`23982`). +* Always converted ``related_name`` to text (unicode), since that is required + on Python 3 for interpolation. Removed conversion of ``related_name`` to text + in migration deconstruction (:ticket:`23455` and :ticket:`23982`). diff --git a/tests/model_fields/models.py b/tests/model_fields/models.py index f53c45c693e..f8f935471cc 100644 --- a/tests/model_fields/models.py +++ b/tests/model_fields/models.py @@ -26,7 +26,7 @@ def get_foo(): class Bar(models.Model): b = models.CharField(max_length=10) - a = models.ForeignKey(Foo, default=get_foo) + a = models.ForeignKey(Foo, default=get_foo, related_name=b'bars') class Whiz(models.Model): diff --git a/tests/model_fields/tests.py b/tests/model_fields/tests.py index 03aae7544cb..53c3b301c75 100644 --- a/tests/model_fields/tests.py +++ b/tests/model_fields/tests.py @@ -181,6 +181,10 @@ class ForeignKeyTests(test.TestCase): fk_model_empty = FkToChar.objects.select_related('out').get(id=fk_model_empty.pk) self.assertEqual(fk_model_empty.out, char_model_empty) + def test_related_name_converted_to_text(self): + rel_name = Bar._meta.get_field_by_name('a')[0].rel.related_name + self.assertIsInstance(rel_name, six.text_type) + class DateTimeFieldTests(unittest.TestCase): def test_datetimefield_to_python_usecs(self):