From a39066ba0bc7a100bb0473111913472326119497 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Tue, 23 Aug 2011 05:12:31 +0000 Subject: [PATCH] Fixed #16299 -- Ensure that unicode strings can be used to identify classes in ForeignKey and ManyToManyFields. Unicode strings aren't actually legal as class names, but this is an issue if you use from __future__ import unicode_literals in your models.py file. Thanks to Martijn Bastiaan for the report, and Anthony Briggs for the final patch. git-svn-id: http://code.djangoproject.com/svn/django/trunk@16663 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/models/options.py | 4 ++-- .../invalid_models/invalid_models/models.py | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/django/db/models/options.py b/django/db/models/options.py index 6f0f406aaa..0cd52a3122 100644 --- a/django/db/models/options.py +++ b/django/db/models/options.py @@ -385,7 +385,7 @@ class Options(object): cache[obj] = model for klass in get_models(include_auto_created=True, only_installed=False): for f in klass._meta.local_fields: - if f.rel and not isinstance(f.rel.to, str) and self == f.rel.to._meta: + if f.rel and not isinstance(f.rel.to, basestring) and self == f.rel.to._meta: cache[RelatedObject(f.rel.to, klass, f)] = None self._related_objects_cache = cache @@ -422,7 +422,7 @@ class Options(object): cache[obj] = model for klass in get_models(only_installed=False): for f in klass._meta.local_many_to_many: - if f.rel and not isinstance(f.rel.to, str) and self == f.rel.to._meta: + if f.rel and not isinstance(f.rel.to, basestring) and self == f.rel.to._meta: cache[RelatedObject(f.rel.to, klass, f)] = None if app_cache_ready(): self._related_many_to_many_cache = cache diff --git a/tests/modeltests/invalid_models/invalid_models/models.py b/tests/modeltests/invalid_models/invalid_models/models.py index 45f302413d..e32ff04ea8 100644 --- a/tests/modeltests/invalid_models/invalid_models/models.py +++ b/tests/modeltests/invalid_models/invalid_models/models.py @@ -1,3 +1,4 @@ +#encoding=utf-8 """ 26. Invalid models @@ -218,6 +219,16 @@ class InvalidSetNull(models.Model): class InvalidSetDefault(models.Model): fk = models.ForeignKey('self', on_delete=models.SET_DEFAULT) +class UnicodeForeignKeys(models.Model): + """Foreign keys which can translate to ascii should be OK, but fail if they're not.""" + good = models.ForeignKey(u'FKTarget') + also_good = models.ManyToManyField(u'FKTarget', related_name='unicode2') + + # In Python 3 this should become legal, but currently causes unicode errors + # when adding the errors in core/management/validation.py + #bad = models.ForeignKey(u'★') + + model_errors = """invalid_models.fielderrors: "charfield": CharFields require a "max_length" attribute that is a positive integer. invalid_models.fielderrors: "charfield2": CharFields require a "max_length" attribute that is a positive integer. invalid_models.fielderrors: "charfield3": CharFields require a "max_length" attribute that is a positive integer.