﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
20932	Issues with model Manager and inheritance.	loic84	nobody	"I've found a couple of issues with the current handling of managers with inheritance.

1. Given:

{{{#!python
class AbstractEvent(models.Model):
    events = models.Manager()
 
    class Meta:
        abstract = True

class BachelorParty(AbstractEvent):
    objects = models.Manager()

class MessyBachelorParty(BachelorParty):
    pass
}}}

If `AbstractEvent` has a manager called anything but `objects` (e.g. `events`):
`MessyBachelorParty.objects.model == <class 'model_inheritance_regress.models.BachelorParty'>`

Which causes the following failure:
{{{
model_inheritance_regress.tests.ModelInheritanceTest.test_abstract_base_class_m2m_relation_inheritance` fails with `AttributeError: 'BachelorParty' object has no attribute 'bachelorparty_ptr'.
}}}

If `AbstractEvent` doesn't have an explicit manager, or has one called `objects`:
`MessyBachelorParty.objects.model == <class 'model_inheritance_regress.models.MessyBachelorParty'>` which is the expected result.

2. Managers in MTI *are* inherited, contrary to what is said [https://docs.djangoproject.com/en/dev/topics/db/managers/#custom-managers-and-model-inheritance in the docs] (now tracked specifically in #25897):

  ""Managers defined on non-abstract base classes are not inherited by child classes. [...] Therefore, they aren’t passed onto child classes."".

The problem is that, since we create the new class by calling `object.__new__()`, normal Python attribute resolution applies, and we gain access to the attributes of the base classes. This doesn't happen to fields because these are removed during the class creation process, but managers are left behind. It's always tempting to think we could just delete them, but you cannot delete something that is not in your own `__dict__`. The problem is not so much that we inherit those managers, but that they don't return the right model type as demonstrated in https://github.com/loic/django/compare/manager_inheritance_bug2."	Bug	closed	Database layer (models, ORM)	dev	Normal	fixed	manager-inheritance	Anssi Kääriäinen LaurensBER aronp@… Marc Tamlyn	Ready for checkin	1	0	0	0	0	0
