Allow to set a 'extra' custom manager withut override the _default_manager

fix_request_path_info
gilgamezh 2015-12-23 21:07:44 -03:00
parent a01fd92d1c
commit f419e37ab3
2 changed files with 38 additions and 1 deletions

View File

@ -167,7 +167,7 @@ class PolymorphicModelBase(ModelBase):
for key, val in new_class.__dict__.items():
if isinstance(val, ManagerDescriptor):
val = val.manager
if not isinstance(val, PolymorphicManager) or type(val) is PolymorphicManager:
if not isinstance(val, PolymorphicManager):
continue
mgr_list.append((val.creation_counter, key, val))

View File

@ -124,6 +124,18 @@ class ModelWithMyManager(ShowFieldTypeAndContent, Model2A):
objects = MyManager()
field4 = models.CharField(max_length=10)
class ModelWithMyManagerNoDefault(ShowFieldTypeAndContent, Model2A):
objects = PolymorphicManager()
my_objects = MyManager()
field4 = models.CharField(max_length=10)
class ModelWithMyManagerDefault(ShowFieldTypeAndContent, Model2A):
my_objects = MyManager()
objects = PolymorphicManager()
field4 = models.CharField(max_length=10)
if django.VERSION >= (1,7):
class ModelWithMyManager2(ShowFieldTypeAndContent, Model2A):
objects = MyManagerQuerySet.as_manager()
@ -700,6 +712,31 @@ class PolymorphicTests(TestCase):
self.assertIs(type(ModelWithMyManager._default_manager), MyManager)
self.assertIs(type(ModelWithMyManager.base_objects), models.Manager)
def test_user_defined_manager_as_secondary(self):
self.create_model2abcd()
ModelWithMyManagerNoDefault.objects.create(field1='D1a', field4='D4a')
ModelWithMyManagerNoDefault.objects.create(field1='D1b', field4='D4b')
objects = ModelWithMyManagerNoDefault.my_objects.all() # MyManager should reverse the sorting of field1
self.assertEqual(repr(objects[0]), '<ModelWithMyManagerNoDefault: id 6, field1 (CharField) "D1b", field4 (CharField) "D4b">')
self.assertEqual(repr(objects[1]), '<ModelWithMyManagerNoDefault: id 5, field1 (CharField) "D1a", field4 (CharField) "D4a">')
self.assertEqual(len(objects), 2)
self.assertIs(type(ModelWithMyManagerNoDefault.my_objects), MyManager)
self.assertIs(type(ModelWithMyManagerNoDefault.objects), PolymorphicManager)
self.assertIs(type(ModelWithMyManagerNoDefault._default_manager), PolymorphicManager)
self.assertIs(type(ModelWithMyManagerNoDefault.base_objects), models.Manager)
def test_user_objects_manager_as_secondary(self):
self.create_model2abcd()
ModelWithMyManagerDefault.objects.create(field1='D1a', field4='D4a')
ModelWithMyManagerDefault.objects.create(field1='D1b', field4='D4b')
self.assertIs(type(ModelWithMyManagerDefault.my_objects), MyManager)
self.assertIs(type(ModelWithMyManagerDefault.objects), PolymorphicManager)
self.assertIs(type(ModelWithMyManagerDefault._default_manager), MyManager)
self.assertIs(type(ModelWithMyManagerDefault.base_objects), models.Manager)
@skipIf(django.VERSION < (1,7), "This test needs Django 1.7+")
def test_user_defined_queryset_as_manager(self):
self.create_model2abcd()