Permalink
Browse files

Fixed #16299 -- Ensure that unicode strings can be used to identify c…

…lasses 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
  • Loading branch information...
1 parent 4302414 commit a39066ba0bc7a100bb0473111913472326119497 @freakboy3742 freakboy3742 committed Aug 23, 2011
Showing with 13 additions and 2 deletions.
  1. +2 −2 django/db/models/options.py
  2. +11 −0 tests/modeltests/invalid_models/invalid_models/models.py
@@ -385,7 +385,7 @@ def _fill_related_objects_cache(self):
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 @@ def _fill_related_many_to_many_cache(self):
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
@@ -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.

0 comments on commit a39066b

Please sign in to comment.