Reading your description again, it seems like you apply the condition to 
default managers as well. Default managers are not "specific to the class they 
are defined on", and I see no problem in their inheritance. In particular:

        class BaseComment(models.Model):
                ... some fields, no manager


        class Comment(BaseComment):
                ... some fields, still no manager

Now, are you suggesting that Comment.objects must be defined explicitly? I find 
that odd.

Shai.

On Saturday 06 February 2016 18:07:22 Alex Poleha wrote:
> Thank you for the suggestion. Pull request is adjusted to give deprecation
> warning instead of raising AttributeError.
> Yes, to silence the warning manager need to be be added to any subclass
> explicitly. It is explained in documentation
> <https://docs.djangoproject.com/en/dev/topics/db/managers/#custom-managers-
> and-model-inheritance> for ages, so I don't think there would be a problem.
> 
> среда, 3 февраля 2016 г., 19:18:24 UTC+3 пользователь Tim Graham написал:
> > Could this go through a deprecation where any use of the inherited
> > managers to be removed will raise a warning for a couple releases? If
> > anyone is relying on the behavior, they just need to add the managers to
> > any subclasses, correct?
> > 
> > On Wednesday, February 3, 2016 at 9:16:41 AM UTC-5, Alex Poleha wrote:
> >> Hi.
> >> 
> >> According to documentation
> >> <https://docs.djangoproject.com/en/1.9/topics/db/managers/#custom-manage
> >> rs-and-model-inheritance> managers defined on non-abstract base classes
> >> are not inherited by child classes. In fact they're inherited via
> >> python MRO. I made pull request
> >> <https://github.com/django/django/pull/5797> to fix it. I find this
> >> 
> >> inheritance embarrassing due to reasons, explained in documentation:
> >>    1. Managers defined on non-abstract base classes are *not* inherited
> >>    by child classes. If you want to reuse a manager from a non-abstract
> >>    base, redeclare it explicitly on the child class. These sorts of
> >>    managers are likely to be fairly specific to the class they are
> >>    defined on, so inheriting them can often lead to unexpected results
> >>    (particularly as far as the default manager goes). Therefore, they
> >>    aren’t passed onto child classes.
> >> 
> >> I also think this example shows some reasons why this inheritance is
> >> embarrasing:
> >> 
> >> class SimpleComment(models.Model):
> >>     test_objects = models.Manager()
> >> 
> >> class BaseComment(models.Model):
> >>     pass
> >> 
> >> class Comment(BaseComment):
> >>     test_objects = models.Manager()
> >> 
> >> print(hasattr(models.SimpleComment, 'objects')) #False
> >> print(hasattr(models.Comment, 'objects'))  #True, we may expect False
> >> here, since 'SimpleComment' gives False in similar sitation.
> >> print(models.Comment.objects.model) #<class 'BaseComment'>, this manager
> >> is not contributed to 'Comment' class
> >> 
> >> Tim Graham suggests asking if anyone relying on this inheritance and
> >> documentation should be fixed instead. Any suggestions?

Reply via email to