Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
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...
commit a39066ba0bc7a100bb0473111913472326119497 1 parent 4302414
@freakboy3742 freakboy3742 authored
View
4 django/db/models/options.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
View
11 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.
Please sign in to comment.
Something went wrong with that request. Please try again.