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):