Skip to content

Commit

Permalink
[1.3.X] Fixed #16299 -- Ensure that unicode strings can be used to id…
Browse files Browse the repository at this point in the history
…entify 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
  • Loading branch information
freakboy3742 committed Aug 23, 2011
1 parent 3853070 commit f317bd2
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 2 deletions.
4 changes: 2 additions & 2 deletions django/db/models/options.py
Expand Up @@ -390,7 +390,7 @@ def _fill_related_objects_cache(self):
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

Expand Down Expand Up @@ -427,7 +427,7 @@ def _fill_related_many_to_many_cache(self):
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
Expand Down
11 changes: 11 additions & 0 deletions tests/modeltests/invalid_models/invalid_models/models.py
@@ -1,3 +1,4 @@
#encoding=utf-8
"""
26. Invalid models
Expand Down Expand Up @@ -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.
Expand Down

0 comments on commit f317bd2

Please sign in to comment.