Fixed internal usage of deprecated `base_objects`

Reverted the change in f898f80594 that
also replaces the internal `base_objects` with `.non_polymorphic()`.
That also changed which querysets was used. Use a clean queryset
instead that has no select-related/prefetch information, etc.. like
previous versions did.
fix_request_path_info
Diederik van der Boor 2018-02-05 12:59:58 +01:00
parent d36f55a58f
commit a6aa95c07e
3 changed files with 7 additions and 4 deletions

View File

@ -163,8 +163,11 @@ class PolymorphicModelBase(ModelBase):
warnings.warn( warnings.warn(
"Using PolymorphicModel.base_objects is deprecated.\n" "Using PolymorphicModel.base_objects is deprecated.\n"
"Use {0}.objects.non_polymorphic() instead.".format(self.__class__.__name__), "Use {0}.objects.non_polymorphic() instead.".format(self.__class__.__name__),
DeprecationWarning) DeprecationWarning, stacklevel=2)
return self._base_objects
@property
def _base_objects(self):
# Create a manager so the API works as expected. Just don't register it # Create a manager so the API works as expected. Just don't register it
# anymore in the Model Meta, so it doesn't substitute our polymorphic # anymore in the Model Meta, so it doesn't substitute our polymorphic
# manager as default manager for the third level of inheritance when # manager as default manager for the third level of inheritance when
@ -188,7 +191,7 @@ class PolymorphicModelBase(ModelBase):
# for all supported Django versions. # for all supported Django versions.
frm = inspect.stack()[1] # frm[1] is caller file name, frm[3] is caller function name frm = inspect.stack()[1] # frm[1] is caller file name, frm[3] is caller function name
if DUMPDATA_COMMAND in frm[1]: if DUMPDATA_COMMAND in frm[1]:
return self.base_objects return self._base_objects
manager = super(PolymorphicModelBase, self)._default_manager manager = super(PolymorphicModelBase, self)._default_manager
if not isinstance(manager, PolymorphicManager): if not isinstance(manager, PolymorphicManager):

View File

@ -172,7 +172,7 @@ class PolymorphicModel(six.with_metaclass(PolymorphicModelBase, models.Model)):
def create_accessor_function_for_model(model, accessor_name): def create_accessor_function_for_model(model, accessor_name):
def accessor_function(self): def accessor_function(self):
attr = model.base_objects.get(pk=self.pk) attr = model._base_objects.get(pk=self.pk)
return attr return attr
return accessor_function return accessor_function

View File

@ -379,7 +379,7 @@ class PolymorphicQuerySet(QuerySet):
# Then we copy the extra() select fields from the base objects to the real objects. # Then we copy the extra() select fields from the base objects to the real objects.
# TODO: defer(), only(): support for these would be around here # TODO: defer(), only(): support for these would be around here
for real_concrete_class, idlist in idlist_per_model.items(): for real_concrete_class, idlist in idlist_per_model.items():
real_objects = real_concrete_class.objects.non_polymorphic().using(self.db).filter(**{ real_objects = real_concrete_class._base_objects.db_manager(self.db).filter(**{
('%s__in' % pk_name): idlist, ('%s__in' % pk_name): idlist,
}) })
real_objects.query.select_related = self.query.select_related # copy select related configuration to new qs real_objects.query.select_related = self.query.select_related # copy select related configuration to new qs