Skip to content

Commit fdb3c81

Browse files
authored
Merge pull request #703 from bckohan/master
Test abstract base model custom manager specification
2 parents 00eea30 + 4a163cf commit fdb3c81

File tree

3 files changed

+100
-1
lines changed

3 files changed

+100
-1
lines changed

src/polymorphic/tests/migrations/0001_initial.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 4.2.27 on 2025-12-10 14:11
1+
# Generated by Django 4.2.27 on 2025-12-10 17:20
22

33
from django.conf import settings
44
from django.db import migrations, models
@@ -68,6 +68,21 @@ class Migration(migrations.Migration):
6868
},
6969
bases=(polymorphic.showfields.ShowFieldTypeAndContent, models.Model),
7070
),
71+
migrations.CreateModel(
72+
name='DerivedManagerTest',
73+
fields=[
74+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
75+
('abstract_field', models.CharField(max_length=32)),
76+
('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_%(app_label)s.%(class)s_set+', to='contenttypes.contenttype')),
77+
],
78+
options={
79+
'abstract': False,
80+
},
81+
managers=[
82+
('basic_manager', django.db.models.manager.Manager()),
83+
('objects', django.db.models.manager.Manager()),
84+
],
85+
),
7186
migrations.CreateModel(
7287
name='Duck',
7388
fields=[
@@ -373,6 +388,16 @@ class Migration(migrations.Migration):
373388
},
374389
bases=('tests.custompkbase',),
375390
),
391+
migrations.CreateModel(
392+
name='DerivedManagerTest2',
393+
fields=[
394+
('derivedmanagertest_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.derivedmanagertest')),
395+
],
396+
options={
397+
'abstract': False,
398+
},
399+
bases=('tests.derivedmanagertest',),
400+
),
376401
migrations.CreateModel(
377402
name='Enhance_Inherit',
378403
fields=[

src/polymorphic/tests/models.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from django.contrib.auth.models import Group
55
from django.contrib.auth import get_user_model
66
from django.contrib.contenttypes.models import ContentType
7+
from django.db.models import Manager
78
from django.db import models
89
from django.db.models.query import QuerySet
910

@@ -645,3 +646,36 @@ class MyChild2Model(MyBaseModel):
645646
...
646647
objects = PolymorphicManager.from_queryset(MyChild2QuerySet)()
647648
base_manager = MyBaseQuerySet.as_manager()
649+
650+
651+
class SpecialQuerySet(PolymorphicQuerySet):
652+
def has_text(self, text):
653+
return self.filter(abstract_field__icontains=text)
654+
655+
656+
class SpecialPolymorphicManager(PolymorphicManager.from_queryset(SpecialQuerySet)):
657+
def custom_queryset(self):
658+
return self.get_queryset()
659+
660+
661+
class AbstractManagerTest(PolymorphicModel):
662+
"""
663+
Tests that custom manager patterns work on abstract base models
664+
"""
665+
666+
objects = SpecialPolymorphicManager()
667+
basic_manager = Manager()
668+
default_manager = PolymorphicManager()
669+
670+
abstract_field = models.CharField(max_length=32)
671+
672+
class Meta:
673+
abstract = True
674+
675+
676+
class DerivedManagerTest(AbstractManagerTest):
677+
pass
678+
679+
680+
class DerivedManagerTest2(DerivedManagerTest):
681+
objects = PolymorphicManager()

src/polymorphic/tests/test_orm.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1635,3 +1635,43 @@ def test_manager_override(self):
16351635
assert MyChild2Model._default_manager is MyChild2Model.objects
16361636
MyChild2Model.objects.filter_by_user(6).count() == 0
16371637
MyChild2Model.base_manager.filter_by_user(6).count() == 1
1638+
1639+
def test_abstract_managers(self):
1640+
from django.db.models import Manager
1641+
from polymorphic.tests.models import (
1642+
AbstractManagerTest,
1643+
DerivedManagerTest,
1644+
DerivedManagerTest2,
1645+
SpecialPolymorphicManager,
1646+
SpecialQuerySet,
1647+
)
1648+
1649+
with self.assertRaises(AttributeError):
1650+
AbstractManagerTest.objects
1651+
with self.assertRaises(AttributeError):
1652+
AbstractManagerTest.basic_manager
1653+
with self.assertRaises(AttributeError):
1654+
AbstractManagerTest.default_manager
1655+
1656+
assert type(DerivedManagerTest.objects) is SpecialPolymorphicManager
1657+
assert type(DerivedManagerTest.basic_manager) is Manager
1658+
assert type(DerivedManagerTest.default_manager) is PolymorphicManager
1659+
assert type(DerivedManagerTest._default_manager) is SpecialPolymorphicManager
1660+
1661+
assert type(DerivedManagerTest2.objects) is PolymorphicManager
1662+
assert type(DerivedManagerTest2.basic_manager) is Manager
1663+
assert type(DerivedManagerTest2.default_manager) is PolymorphicManager
1664+
assert type(DerivedManagerTest2._default_manager) is PolymorphicManager
1665+
1666+
dmt1 = DerivedManagerTest.objects.create(abstract_field="dmt1")
1667+
dmt2 = DerivedManagerTest2.objects.create(abstract_field="dmt2")
1668+
1669+
assert DerivedManagerTest.objects.has_text("dmt").count() == 2
1670+
assert dmt1 in DerivedManagerTest.objects.has_text("dmt")
1671+
assert dmt2 in DerivedManagerTest.objects.has_text("dmt")
1672+
assert DerivedManagerTest.objects.custom_queryset().has_text("dmt").count() == 2
1673+
1674+
assert isinstance(DerivedManagerTest.objects.has_text("dmt"), SpecialQuerySet)
1675+
1676+
with self.assertRaises(AttributeError):
1677+
DerivedManagerTest2.objects.has_text("dmt")

0 commit comments

Comments
 (0)