  class LowerStatusPerson(MyPersonProxy):
      status = models.CharField(max_length=80)
  
  
  @python_2_unicode_compatible
  class User(models.Model):
      name = models.CharField(max_length=100)
  
 
</s> remove     FORWARD_PROPERTIES = {'fields', 'many_to_many', 'concrete_fields',
                          'local_concrete_fields', '_forward_fields_map',
                          'managers', 'managers_map'}
 </s> add     FORWARD_PROPERTIES = {
        'fields', 'many_to_many', 'concrete_fields', 'local_concrete_fields',
        '_forward_fields_map', 'managers', 'managers_map', 'base_manager',
        'default_manager',
    } </s> remove def can_use_for_related_field(manager_class):
    return manager_class is Manager or getattr(manager_class, 'use_for_related_fields', False)


def ensure_default_manager(model):
    """
    Ensures that a Model subclass contains a default manager and sets the
    _default_manager and _base_manager attributes on the class.
    """

    if not model._meta.managers:
        if any(f.name == 'objects' for f in model._meta.fields):
            raise ValueError(
                "Model %s must specify a custom Manager, because it has a "
                "field named 'objects'" % model.__name__
            )
        model.add_to_class('objects', Manager())

    model._default_manager = model._meta.managers[0]

    # Just alias _base_manager if default manager is suitable.
    if can_use_for_related_field(model._default_manager.__class__):
        model._base_manager = model._default_manager

    # Otherwise search for a suitable manager type in the default manager MRO.
    else:
        for base_manager_class in model._default_manager.__class__.mro()[1:]:
            if can_use_for_related_field(base_manager_class):
                model._base_manager = base_manager_class()
                model._base_manager.name = '_base_manager'
                model._base_manager.model = model
                break
        else:
            raise ValueError("Could not find a suitable base manager.")


 </s> add  </s> remove         def reconstruct_manager(mgr):
            as_manager, manager_path, qs_path, args, kwargs = mgr.deconstruct()
            if as_manager:
                qs_class = import_string(qs_path)
                instance = qs_class.as_manager()
            else:
                manager_class = import_string(manager_path)
                instance = manager_class(*args, **kwargs)
            # We rely on the ordering of the creation_counter of the original
            # instance
            name = force_text(mgr.name)
            managers_mapping[name] = (mgr.creation_counter, instance)

        if hasattr(model, "_default_manager"):
            default_manager_name = force_text(model._default_manager.name)
            # Make sure the default manager is always the first
 </s> add         # Make sure the default manager is always first since ordering chooses
        # the default manager.
        if not model._default_manager.auto_created:
    objects = models.Manager()

  class LowerStatusPerson(MyPersonProxy):
      status = models.CharField(max_length=80)
  
    objects = models.Manager()

  
  @python_2_unicode_compatible
  class User(models.Model):
      name = models.CharField(max_length=100)
  
keep keep add keep keep keep keep keep
 Fixed #10506, #13793, #14891, #25201 -- Introduced new APIs to specify models' default and base managers.

This deprecates use_for_related_fields.

Old API:

class CustomManager(models.Model):
    use_for_related_fields = True

class Model(models.Model):
    custom_manager = CustomManager()

New API:

class Model(models.Model):
    custom_manager = CustomManager()

    class Meta:
        base_manager_name = 'custom_manager'

Refs #20932, #25897.

Thanks Carl Meyer for the guidance throughout this work.
Thanks Tim Graham for writing the docs. 
tests/proxy_models/models.py