From f317bd20d762616ad5cf502c59eb55835a75056a Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Tue, 23 Aug 2011 15:56:40 +0000 Subject: [PATCH] [1.3.X] 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. Backport of r16663 from trunk. git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.3.X@16675 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 10617dc9e9..5b1f66835a 100644 --- a/django/db/models/options.py +++ b/django/db/models/options.py @@ -390,7 +390,7 @@ class Options(object): cache[obj] = model for klass in get_models(include_auto_created=True): 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 @@ -427,7 +427,7 @@ class Options(object): cache[obj] = model for klass in get_models(): 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.