mirror of
https://github.com/django/django.git
synced 2025-10-25 06:36:07 +00:00
Fixed #26162 -- Checked query name clashes of hidden relationships.
Although reverse accessor clashes should be skipped query name can't be hidden. Thanks to Ian Foote and Tim Graham for the review.
This commit is contained in:
@@ -194,12 +194,6 @@ class RelatedField(Field):
|
||||
if not isinstance(self.remote_field.model, ModelBase):
|
||||
return []
|
||||
|
||||
# If the field doesn't install backward relation on the target model (so
|
||||
# `is_hidden` returns True), then there are no clashes to check and we
|
||||
# can skip these fields.
|
||||
if self.remote_field.is_hidden():
|
||||
return []
|
||||
|
||||
# Consider that we are checking field `Model.foreign` and the models
|
||||
# are:
|
||||
#
|
||||
@@ -211,12 +205,15 @@ class RelatedField(Field):
|
||||
# foreign = models.ForeignKey(Target)
|
||||
# m2m = models.ManyToManyField(Target)
|
||||
|
||||
rel_opts = self.remote_field.model._meta
|
||||
# rel_opts.object_name == "Target"
|
||||
rel_opts = self.remote_field.model._meta
|
||||
# If the field doesn't install a backward relation on the target model
|
||||
# (so `is_hidden` returns True), then there are no clashes to check
|
||||
# and we can skip these fields.
|
||||
rel_is_hidden = self.remote_field.is_hidden()
|
||||
rel_name = self.remote_field.get_accessor_name() # i. e. "model_set"
|
||||
rel_query_name = self.related_query_name() # i. e. "model"
|
||||
field_name = "%s.%s" % (opts.object_name,
|
||||
self.name) # i. e. "Model.field"
|
||||
field_name = "%s.%s" % (opts.object_name, self.name) # i. e. "Model.field"
|
||||
|
||||
# Check clashes between accessor or reverse query name of `field`
|
||||
# and any other field name -- i.e. accessor for Model.foreign is
|
||||
@@ -225,7 +222,7 @@ class RelatedField(Field):
|
||||
for clash_field in potential_clashes:
|
||||
clash_name = "%s.%s" % (rel_opts.object_name,
|
||||
clash_field.name) # i. e. "Target.model_set"
|
||||
if clash_field.name == rel_name:
|
||||
if not rel_is_hidden and clash_field.name == rel_name:
|
||||
errors.append(
|
||||
checks.Error(
|
||||
"Reverse accessor for '%s' clashes with field name '%s'." % (field_name, clash_name),
|
||||
@@ -255,7 +252,7 @@ class RelatedField(Field):
|
||||
clash_name = "%s.%s" % ( # i. e. "Model.m2m"
|
||||
clash_field.related_model._meta.object_name,
|
||||
clash_field.field.name)
|
||||
if clash_field.get_accessor_name() == rel_name:
|
||||
if not rel_is_hidden and clash_field.get_accessor_name() == rel_name:
|
||||
errors.append(
|
||||
checks.Error(
|
||||
"Reverse accessor for '%s' clashes with reverse accessor for '%s'." % (field_name, clash_name),
|
||||
|
||||
Reference in New Issue
Block a user