Skip to content

Commit

Permalink
Fixed #35230 -- Added cached ForeignObjectRel.accessor_name.
Browse files Browse the repository at this point in the history
  • Loading branch information
adamchainz authored Feb 19, 2024
1 parent 7ba6c9e commit 5e80390
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 14 deletions.
2 changes: 1 addition & 1 deletion django/contrib/admindocs/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,7 @@ def get_context_data(self, **kwargs):
"app_label": rel.related_model._meta.app_label,
"object_name": rel.related_model._meta.object_name,
}
accessor = rel.get_accessor_name()
accessor = rel.accessor_name
fields.append(
{
"name": "%s.all" % accessor,
Expand Down
10 changes: 5 additions & 5 deletions django/db/models/fields/related.py
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ def _check_clashes(self):
# (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_name = self.remote_field.accessor_name # i. e. "model_set"
rel_query_name = self.related_query_name() # i. e. "model"
# i.e. "app_label.Model.field".
field_name = "%s.%s" % (opts.label, self.name)
Expand Down Expand Up @@ -307,7 +307,7 @@ def _check_clashes(self):
clash_field.related_model._meta.label,
clash_field.field.name,
)
if not rel_is_hidden and clash_field.get_accessor_name() == rel_name:
if not rel_is_hidden and clash_field.accessor_name == rel_name:
errors.append(
checks.Error(
f"Reverse accessor '{rel_opts.object_name}.{rel_name}' "
Expand All @@ -323,7 +323,7 @@ def _check_clashes(self):
)
)

if clash_field.get_accessor_name() == rel_query_name:
if clash_field.accessor_name == rel_query_name:
errors.append(
checks.Error(
"Reverse query name for '%s' clashes with reverse query name "
Expand Down Expand Up @@ -893,7 +893,7 @@ def contribute_to_related_class(self, cls, related):
):
setattr(
cls._meta.concrete_model,
related.get_accessor_name(),
related.accessor_name,
self.related_accessor_class(related),
)
# While 'limit_choices_to' might be a callable, simply pass
Expand Down Expand Up @@ -1947,7 +1947,7 @@ def contribute_to_related_class(self, cls, related):
):
setattr(
cls,
related.get_accessor_name(),
related.accessor_name,
ManyToManyDescriptor(self.remote_field, reverse=True),
)

Expand Down
8 changes: 4 additions & 4 deletions django/db/models/fields/related_descriptors.py
Original file line number Diff line number Diff line change
Expand Up @@ -524,7 +524,7 @@ def __get__(self, instance, cls=None):
if rel_obj is None:
raise self.RelatedObjectDoesNotExist(
"%s has no %s."
% (instance.__class__.__name__, self.related.get_accessor_name())
% (instance.__class__.__name__, self.related.accessor_name)
)
else:
return rel_obj
Expand Down Expand Up @@ -564,7 +564,7 @@ def __set__(self, instance, value):
% (
value,
instance._meta.object_name,
self.related.get_accessor_name(),
self.related.accessor_name,
self.related.related_model._meta.object_name,
)
)
Expand Down Expand Up @@ -652,7 +652,7 @@ def __get__(self, instance, cls=None):
def _get_set_deprecation_msg_params(self):
return (
"reverse side of a related set",
self.rel.get_accessor_name(),
self.rel.accessor_name,
)

def __set__(self, instance, value):
Expand Down Expand Up @@ -1019,7 +1019,7 @@ def _get_set_deprecation_msg_params(self):
return (
"%s side of a many-to-many set"
% ("reverse" if self.reverse else "forward"),
self.rel.get_accessor_name() if self.reverse else self.field.name,
self.rel.accessor_name if self.reverse else self.field.name,
)


Expand Down
6 changes: 5 additions & 1 deletion django/db/models/fields/reverse_related.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,10 @@ def set_field_name(self):
# example custom multicolumn joins currently have no remote field).
self.field_name = None

@cached_property
def accessor_name(self):
return self.get_accessor_name()

def get_accessor_name(self, model=None):
# This method encapsulates the logic that decides what name to give an
# accessor descriptor that retrieves related many-to-one or
Expand Down Expand Up @@ -252,7 +256,7 @@ def get_cache_name(self):
Return the name of the cache key to use for storing an instance of the
forward model on the reverse model.
"""
return self.get_accessor_name()
return self.accessor_name


class ManyToOneRel(ForeignObjectRel):
Expand Down
4 changes: 1 addition & 3 deletions tests/one_to_one/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -473,9 +473,7 @@ def test_hidden_accessor(self):
self.assertFalse(
hasattr(
Target,
HiddenPointer._meta.get_field(
"target"
).remote_field.get_accessor_name(),
HiddenPointer._meta.get_field("target").remote_field.accessor_name,
)
)

Expand Down

0 comments on commit 5e80390

Please sign in to comment.