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.