Loading django/db/models/fields/related.py +12 −4 Original line number Diff line number Diff line Loading @@ -122,10 +122,18 @@ class RelatedField(Field): import re import keyword related_name = self.rel.related_name is_valid_id = (related_name and re.match('^[a-zA-Z_][a-zA-Z0-9_]*$', related_name) and not keyword.iskeyword(related_name)) if related_name and not (is_valid_id or related_name.endswith('+')): if not related_name: return [] is_valid_id = True if keyword.iskeyword(related_name): is_valid_id = False if six.PY3: if not related_name.isidentifier(): is_valid_id = False else: if not re.match(r'^[a-zA-Z_][a-zA-Z0-9_]*\Z', related_name): is_valid_id = False if not (is_valid_id or related_name.endswith('+')): return [ checks.Error( "The name '%s' is invalid related_name for field %s.%s" % Loading docs/releases/1.8.3.txt +3 −0 Original line number Diff line number Diff line Loading @@ -82,3 +82,6 @@ Bugfixes * Fixed a regression when deleting a model through the admin that has a ``GenericRelation`` with a ``related_query_name`` (:ticket:`24940`). * Reallowed non-ASCII values for ``ForeignKey.related_name`` on Python 3 by fixing the false positive system check (:ticket:`25016`). docs/spelling_wordlist +1 −0 Original line number Diff line number Diff line Loading @@ -511,6 +511,7 @@ Quickstart quoteless Radziej rc reallowed rebase rebased rebasing Loading tests/invalid_models_tests/test_relative_fields.py +9 −2 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ from django.core.checks import Error, Warning as DjangoWarning from django.db import models from django.test.testcases import skipIfDBFeature from django.test.utils import override_settings from django.utils import six from .base import IsolatedModelsTestCase Loading Loading @@ -559,9 +560,12 @@ class RelativeFieldTests(IsolatedModelsTestCase): 'contains_%s_whitespace' % whitespace, 'ends_with_with_illegal_non_alphanumeric_%s' % illegal_non_alphanumeric, 'ends_with_whitespace_%s' % whitespace, # Python's keyword 'with', 'with', # a Python keyword 'related_name\n', ] # Python 2 crashes on non-ASCII strings. if six.PY3: invalid_related_names.append(',') class Parent(models.Model): pass Loading Loading @@ -600,6 +604,9 @@ class RelativeFieldTests(IsolatedModelsTestCase): '_+', '+', ] # Python 2 crashes on non-ASCII strings. if six.PY3: related_names.extend(['試', '試驗+']) class Parent(models.Model): pass Loading Loading
django/db/models/fields/related.py +12 −4 Original line number Diff line number Diff line Loading @@ -122,10 +122,18 @@ class RelatedField(Field): import re import keyword related_name = self.rel.related_name is_valid_id = (related_name and re.match('^[a-zA-Z_][a-zA-Z0-9_]*$', related_name) and not keyword.iskeyword(related_name)) if related_name and not (is_valid_id or related_name.endswith('+')): if not related_name: return [] is_valid_id = True if keyword.iskeyword(related_name): is_valid_id = False if six.PY3: if not related_name.isidentifier(): is_valid_id = False else: if not re.match(r'^[a-zA-Z_][a-zA-Z0-9_]*\Z', related_name): is_valid_id = False if not (is_valid_id or related_name.endswith('+')): return [ checks.Error( "The name '%s' is invalid related_name for field %s.%s" % Loading
docs/releases/1.8.3.txt +3 −0 Original line number Diff line number Diff line Loading @@ -82,3 +82,6 @@ Bugfixes * Fixed a regression when deleting a model through the admin that has a ``GenericRelation`` with a ``related_query_name`` (:ticket:`24940`). * Reallowed non-ASCII values for ``ForeignKey.related_name`` on Python 3 by fixing the false positive system check (:ticket:`25016`).
docs/spelling_wordlist +1 −0 Original line number Diff line number Diff line Loading @@ -511,6 +511,7 @@ Quickstart quoteless Radziej rc reallowed rebase rebased rebasing Loading
tests/invalid_models_tests/test_relative_fields.py +9 −2 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ from django.core.checks import Error, Warning as DjangoWarning from django.db import models from django.test.testcases import skipIfDBFeature from django.test.utils import override_settings from django.utils import six from .base import IsolatedModelsTestCase Loading Loading @@ -559,9 +560,12 @@ class RelativeFieldTests(IsolatedModelsTestCase): 'contains_%s_whitespace' % whitespace, 'ends_with_with_illegal_non_alphanumeric_%s' % illegal_non_alphanumeric, 'ends_with_whitespace_%s' % whitespace, # Python's keyword 'with', 'with', # a Python keyword 'related_name\n', ] # Python 2 crashes on non-ASCII strings. if six.PY3: invalid_related_names.append(',') class Parent(models.Model): pass Loading Loading @@ -600,6 +604,9 @@ class RelativeFieldTests(IsolatedModelsTestCase): '_+', '+', ] # Python 2 crashes on non-ASCII strings. if six.PY3: related_names.extend(['試', '試驗+']) class Parent(models.Model): pass Loading