Merge pull request #716 from bckohan/master

Add a test for extending a normal base model as polymorphic
This commit is contained in:
Brian Kohan 2025-12-11 16:36:08 -08:00 committed by GitHub
commit ec19ef4bbc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 85 additions and 1 deletions

View File

@ -1,4 +1,4 @@
# Generated by Django 4.2 on 2025-12-11 17:03
# Generated by Django 4.2 on 2025-12-11 18:22
from django.conf import settings
from django.db import migrations, models
@ -230,6 +230,13 @@ class Migration(migrations.Migration):
'base_manager_name': 'objects',
},
),
migrations.CreateModel(
name='NormalBase',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('nb_field', models.IntegerField()),
],
),
migrations.CreateModel(
name='One2OneRelatingModel',
fields=[
@ -642,6 +649,14 @@ class Migration(migrations.Migration):
},
bases=('tests.proxybase',),
),
migrations.CreateModel(
name='NormalExtension',
fields=[
('normalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.normalbase')),
('ne_field', models.CharField(max_length=12)),
],
bases=('tests.normalbase',),
),
migrations.CreateModel(
name='One2OneRelatingModelDerived',
fields=[
@ -1204,6 +1219,19 @@ class Migration(migrations.Migration):
],
bases=('tests.plainb',),
),
migrations.CreateModel(
name='PolyExtension',
fields=[
('normalextension_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.normalextension')),
('poly_ext_field', models.IntegerField()),
('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')),
],
options={
'abstract': False,
'base_manager_name': 'objects',
},
bases=('tests.normalextension', models.Model),
),
migrations.CreateModel(
name='ProxyModelA',
fields=[
@ -1340,6 +1368,18 @@ class Migration(migrations.Migration):
},
bases=('tests.model2c',),
),
migrations.CreateModel(
name='PolyExtChild',
fields=[
('polyextension_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='tests.polyextension')),
('poly_child_field', models.CharField(max_length=12)),
],
options={
'abstract': False,
'base_manager_name': 'objects',
},
bases=('tests.polyextension',),
),
migrations.CreateModel(
name='UUIDArtProjectB',
fields=[

View File

@ -714,3 +714,19 @@ class FKTest(models.Model):
class NoChildren(PolymorphicModel):
field1 = models.CharField(max_length=12)
class NormalBase(models.Model):
nb_field = models.IntegerField()
class NormalExtension(NormalBase):
ne_field = models.CharField(max_length=12)
class PolyExtension(PolymorphicModel, NormalExtension):
poly_ext_field = models.IntegerField()
class PolyExtChild(PolyExtension):
poly_child_field = models.CharField(max_length=12)

View File

@ -1707,3 +1707,31 @@ class PolymorphicTests(TransactionTestCase):
assert fk_test.fk == child
assert isinstance(fk_test.fk, FKTestChild)
def test_polymorphic_extension(self):
from polymorphic.tests.models import (
NormalBase,
NormalExtension,
PolyExtension,
PolyExtChild,
)
nb = NormalBase.objects.create(nb_field=5)
ne = NormalExtension.objects.create(nb_field=6, ne_field="normal ext")
poly_ext = PolyExtension.objects.create(nb_field=6, ne_field="poly ext", poly_ext_field=7)
child_ext = PolyExtChild.objects.create(
nb_field=7, ne_field="child ext", poly_ext_field=8, poly_child_field="poly child"
)
assert set(NormalBase.objects.all()) == {
nb,
NormalBase.objects.get(pk=ne.pk),
NormalBase.objects.get(pk=poly_ext.pk),
NormalBase.objects.get(pk=child_ext.pk),
}
assert set(NormalExtension.objects.all()) == {
NormalExtension.objects.get(pk=ne.pk),
NormalExtension.objects.get(pk=poly_ext.pk),
NormalExtension.objects.get(pk=child_ext.pk),
}
assert set(PolyExtension.objects.all()) == {poly_ext, child_ext}
assert set(PolyExtChild.objects.all()) == {child_ext}