1
0
mirror of https://github.com/django/django.git synced 2025-03-06 15:32:33 +00:00

Avoided unnecessary recreation of RelatedObjects

Refs #19399. Thanks to Track alias KJ for the patch.
This commit is contained in:
Anssi Kääriäinen 2013-01-18 07:09:39 +02:00
parent 6158c79dbe
commit 3647c0a49a
3 changed files with 6 additions and 11 deletions

View File

@ -27,7 +27,6 @@ def get_validation_errors(outfile, app=None):
""" """
from django.db import models, connection from django.db import models, connection
from django.db.models.loading import get_app_errors from django.db.models.loading import get_app_errors
from django.db.models.fields.related import RelatedObject
from django.db.models.deletion import SET_NULL, SET_DEFAULT from django.db.models.deletion import SET_NULL, SET_DEFAULT
e = ModelErrorCollection(outfile) e = ModelErrorCollection(outfile)
@ -154,7 +153,7 @@ def get_validation_errors(outfile, app=None):
e.add(opts, "Field '%s' under model '%s' must have a unique=True constraint." % (f.rel.field_name, f.rel.to.__name__)) e.add(opts, "Field '%s' under model '%s' must have a unique=True constraint." % (f.rel.field_name, f.rel.to.__name__))
rel_opts = f.rel.to._meta rel_opts = f.rel.to._meta
rel_name = RelatedObject(f.rel.to, cls, f).get_accessor_name() rel_name = f.related.get_accessor_name()
rel_query_name = f.related_query_name() rel_query_name = f.related_query_name()
if not f.rel.is_hidden(): if not f.rel.is_hidden():
for r in rel_opts.fields: for r in rel_opts.fields:
@ -278,7 +277,7 @@ def get_validation_errors(outfile, app=None):
) )
rel_opts = f.rel.to._meta rel_opts = f.rel.to._meta
rel_name = RelatedObject(f.rel.to, cls, f).get_accessor_name() rel_name = f.related.get_accessor_name()
rel_query_name = f.related_query_name() rel_query_name = f.related_query_name()
# If rel_name is none, there is no reverse accessor (this only # If rel_name is none, there is no reverse accessor (this only
# occurs for symmetrical m2m relations to self). If this is the # occurs for symmetrical m2m relations to self). If this is the

View File

@ -4,7 +4,6 @@ import re
from bisect import bisect from bisect import bisect
from django.conf import settings from django.conf import settings
from django.db.models.related import RelatedObject
from django.db.models.fields.related import ManyToManyRel from django.db.models.fields.related import ManyToManyRel
from django.db.models.fields import AutoField, FieldDoesNotExist from django.db.models.fields import AutoField, FieldDoesNotExist
from django.db.models.fields.proxy import OrderWrt from django.db.models.fields.proxy import OrderWrt
@ -424,10 +423,10 @@ class Options(object):
for f in klass._meta.local_fields: for f in klass._meta.local_fields:
if f.rel and not isinstance(f.rel.to, six.string_types): if f.rel and not isinstance(f.rel.to, six.string_types):
if self == f.rel.to._meta: if self == f.rel.to._meta:
cache[RelatedObject(f.rel.to, klass, f)] = None cache[f.related] = None
proxy_cache[RelatedObject(f.rel.to, klass, f)] = None proxy_cache[f.related] = None
elif self.concrete_model == f.rel.to._meta.concrete_model: elif self.concrete_model == f.rel.to._meta.concrete_model:
proxy_cache[RelatedObject(f.rel.to, klass, f)] = None proxy_cache[f.related] = None
self._related_objects_cache = cache self._related_objects_cache = cache
self._related_objects_proxy_cache = proxy_cache self._related_objects_proxy_cache = proxy_cache
@ -468,7 +467,7 @@ class Options(object):
if (f.rel if (f.rel
and not isinstance(f.rel.to, six.string_types) and not isinstance(f.rel.to, six.string_types)
and self == f.rel.to._meta): and self == f.rel.to._meta):
cache[RelatedObject(f.rel.to, klass, f)] = None cache[f.related] = None
if app_cache_ready(): if app_cache_ready():
self._related_many_to_many_cache = cache self._related_many_to_many_cache = cache
return cache return cache

View File

@ -702,14 +702,11 @@ class BaseInlineFormSet(BaseModelFormSet):
"""A formset for child objects related to a parent.""" """A formset for child objects related to a parent."""
def __init__(self, data=None, files=None, instance=None, def __init__(self, data=None, files=None, instance=None,
save_as_new=False, prefix=None, queryset=None, **kwargs): save_as_new=False, prefix=None, queryset=None, **kwargs):
from django.db.models.fields.related import RelatedObject
if instance is None: if instance is None:
self.instance = self.fk.rel.to() self.instance = self.fk.rel.to()
else: else:
self.instance = instance self.instance = instance
self.save_as_new = save_as_new self.save_as_new = save_as_new
# is there a better way to get the object descriptor?
self.rel_name = RelatedObject(self.fk.rel.to, self.model, self.fk).get_accessor_name()
if queryset is None: if queryset is None:
queryset = self.model._default_manager queryset = self.model._default_manager
if self.instance.pk: if self.instance.pk: