From 9f76ea1eaad0db0183fa3b5bade16392db0cafbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anssi=20K=C3=A4=C3=A4ri=C3=A4inen?= Date: Sat, 2 Nov 2013 21:16:33 +0200 Subject: [PATCH] Fixed #21375 -- related_name='+' clashed with other '+' names --- django/core/management/validation.py | 2 +- tests/model_validation/models.py | 21 +++++++++++++++++++++ tests/model_validation/tests.py | 2 ++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/django/core/management/validation.py b/django/core/management/validation.py index 4ec421c699..90a78403fb 100644 --- a/django/core/management/validation.py +++ b/django/core/management/validation.py @@ -309,7 +309,7 @@ def get_validation_errors(outfile, app=None): # occurs for symmetrical m2m relations to self). If this is the # case, there are no clashes to check for this field, as there are # no reverse descriptors for this field. - if rel_name is not None: + if not f.rel.is_hidden(): for r in rel_opts.fields: if r.name == rel_name: e.add(opts, "Accessor for m2m field '%s' clashes with field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name)) diff --git a/tests/model_validation/models.py b/tests/model_validation/models.py index 9a2a5f7cd0..d2e77cbccc 100644 --- a/tests/model_validation/models.py +++ b/tests/model_validation/models.py @@ -25,3 +25,24 @@ class ThingWithIterableChoices(models.Model): # Testing choices= Iterable of Iterables # See: https://code.djangoproject.com/ticket/20430 thing = models.CharField(max_length=100, blank=True, choices=Things()) + + class Meta: + # Models created as unmanaged as these aren't ever queried + managed = False + + +class ManyToManyRel(models.Model): + thing1 = models.ManyToManyField(ThingWithIterableChoices, related_name='+') + thing2 = models.ManyToManyField(ThingWithIterableChoices, related_name='+') + + class Meta: + # Models created as unmanaged as these aren't ever queried + managed = False + +class FKRel(models.Model): + thing1 = models.ForeignKey(ThingWithIterableChoices, related_name='+') + thing2 = models.ForeignKey(ThingWithIterableChoices, related_name='+') + + class Meta: + # Models created as unmanaged as these aren't ever queried + managed = False diff --git a/tests/model_validation/tests.py b/tests/model_validation/tests.py index ffd0d89412..494af97f96 100644 --- a/tests/model_validation/tests.py +++ b/tests/model_validation/tests.py @@ -10,4 +10,6 @@ class ModelValidationTest(TestCase): # Validation Tests: # * choices= Iterable of Iterables # See: https://code.djangoproject.com/ticket/20430 + # * related_name='+' doesn't clash with another '+' + # See: https://code.djangoproject.com/ticket/21375 management.call_command("validate", stdout=six.StringIO())