mirror of
https://github.com/django-polymorphic/django-polymorphic.git
synced 2026-03-04 11:11:17 +03:00
address test warnings, add inheritance tests
This commit is contained in:
parent
447e8c24d0
commit
fee9d35519
|
|
@ -1,5 +1,7 @@
|
|||
from inspect import isclass
|
||||
from django.contrib.admin import register, ModelAdmin, site as admin_site
|
||||
from django.db.models.query import QuerySet
|
||||
from django.http import HttpRequest
|
||||
from polymorphic.admin import (
|
||||
StackedPolymorphicInline,
|
||||
PolymorphicInlineSupportMixin,
|
||||
|
|
@ -35,6 +37,9 @@ admin_site.register(Model2D, PolymorphicChildModelAdmin)
|
|||
class PlainAAdmin(ModelAdmin):
|
||||
search_fields = ["field1"]
|
||||
|
||||
def get_queryset(self, request: HttpRequest) -> QuerySet:
|
||||
return super().get_queryset(request).order_by("pk")
|
||||
|
||||
|
||||
class Inline(StackedPolymorphicInline):
|
||||
model = InlineModelA
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Generated by Django 4.2.27 on 2025-12-08 15:20
|
||||
# Generated by Django 4.2.27 on 2025-12-09 01:30
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
|
@ -13,8 +13,8 @@ class Migration(migrations.Migration):
|
|||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('auth', '0012_alter_user_first_name_max_length'),
|
||||
('contenttypes', '0002_remove_content_type_name'),
|
||||
('auth', '0012_alter_user_first_name_max_length'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
|
|
@ -581,6 +581,17 @@ class Migration(migrations.Migration):
|
|||
},
|
||||
bases=('tests.one2onerelatingmodel',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='ParentLinkAndRelatedName',
|
||||
fields=[
|
||||
('superclass', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, related_name='related_name_subclass', serialize=False, to='tests.modelshow1_plain')),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
'base_manager_name': 'objects',
|
||||
},
|
||||
bases=('tests.modelshow1_plain',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='PlainB',
|
||||
fields=[
|
||||
|
|
@ -647,17 +658,6 @@ class Migration(migrations.Migration):
|
|||
},
|
||||
bases=('tests.subclassselectorabstractbasemodel',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='TestParentLinkAndRelatedName',
|
||||
fields=[
|
||||
('superclass', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, related_name='related_name_subclass', serialize=False, to='tests.modelshow1_plain')),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
'base_manager_name': 'objects',
|
||||
},
|
||||
bases=('tests.modelshow1_plain',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='UserProfile',
|
||||
fields=[
|
||||
|
|
@ -889,6 +889,17 @@ class Migration(migrations.Migration):
|
|||
'base_manager_name': 'objects',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Foo',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('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',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='DateModel',
|
||||
fields=[
|
||||
|
|
@ -928,6 +939,30 @@ class Migration(migrations.Migration):
|
|||
},
|
||||
bases=(polymorphic.showfields.ShowFieldTypeAndContent, models.Model),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Baz',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('modified_at', models.DateTimeField(auto_now=True)),
|
||||
('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,
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Bar',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('modified_at', models.DateTimeField(auto_now=True)),
|
||||
('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,
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='ArtProject',
|
||||
fields=[
|
||||
|
|
|
|||
|
|
@ -405,7 +405,7 @@ class RelatedNameClash(ShowFieldType, PolymorphicModel):
|
|||
# class with a parent_link to superclass, and a related_name back to subclass
|
||||
|
||||
|
||||
class TestParentLinkAndRelatedName(ModelShow1_plain):
|
||||
class ParentLinkAndRelatedName(ModelShow1_plain):
|
||||
superclass = models.OneToOneField(
|
||||
ModelShow1_plain,
|
||||
on_delete=models.CASCADE,
|
||||
|
|
@ -584,3 +584,31 @@ class SpecialAccount1_1(SpecialAccount1):
|
|||
|
||||
class SpecialAccount2(Account):
|
||||
extra1 = models.CharField(default="", blank=True, max_length=30)
|
||||
|
||||
|
||||
class ModelMixin(models.Model):
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
modified_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
|
||||
class PolymorphicMixin(PolymorphicModel):
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
modified_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
|
||||
class Foo(PolymorphicModel):
|
||||
pass
|
||||
|
||||
|
||||
class Bar(PolymorphicMixin, PolymorphicModel):
|
||||
pass
|
||||
|
||||
|
||||
class Baz(ModelMixin, PolymorphicModel):
|
||||
pass
|
||||
|
|
|
|||
|
|
@ -138,3 +138,5 @@ STATIC_URL = "/static/"
|
|||
ALLOWED_HOSTS = ["*"]
|
||||
|
||||
ROOT_URLCONF = "polymorphic.tests.urls"
|
||||
|
||||
USE_TZ = False
|
||||
|
|
|
|||
10
src/polymorphic/tests/test_inheritance.py
Normal file
10
src/polymorphic/tests/test_inheritance.py
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
from polymorphic.tests.models import Foo, Bar, Baz
|
||||
from polymorphic.managers import PolymorphicManager
|
||||
from django.test import TestCase
|
||||
|
||||
|
||||
class InheritanceTests(TestCase):
|
||||
def test_mixin_inherited_managers(self):
|
||||
self.assertIsInstance(Foo._base_manager, PolymorphicManager)
|
||||
self.assertIsInstance(Bar._base_manager, PolymorphicManager)
|
||||
self.assertIsInstance(Baz._base_manager, PolymorphicManager)
|
||||
|
|
@ -86,7 +86,7 @@ from polymorphic.tests.models import (
|
|||
SubclassSelectorAbstractConcreteModel,
|
||||
SubclassSelectorProxyBaseModel,
|
||||
SubclassSelectorProxyConcreteModel,
|
||||
TestParentLinkAndRelatedName,
|
||||
ParentLinkAndRelatedName,
|
||||
UUIDArtProject,
|
||||
UUIDPlainA,
|
||||
UUIDPlainB,
|
||||
|
|
@ -458,8 +458,7 @@ class PolymorphicTests(TransactionTestCase):
|
|||
def test_onetoone_field(self):
|
||||
self.create_model2abcd()
|
||||
|
||||
# FIXME: We should not use base_objects here.
|
||||
a = Model2A.base_objects.get(field1="C1")
|
||||
a = Model2A.objects.non_polymorphic().get(field1="C1")
|
||||
b = One2OneRelatingModelDerived.objects.create(one2one=a, field1="f1", field2="f2")
|
||||
|
||||
# FIXME: this result is basically wrong, probably due to Django cacheing (we used base_objects), but should not be a problem
|
||||
|
|
@ -960,17 +959,17 @@ class PolymorphicTests(TransactionTestCase):
|
|||
assert o.bar == "XYZ"
|
||||
|
||||
def test_parent_link_and_related_name(self):
|
||||
t = TestParentLinkAndRelatedName(field1="TestParentLinkAndRelatedName")
|
||||
t = ParentLinkAndRelatedName(field1="ParentLinkAndRelatedName")
|
||||
t.save()
|
||||
p = ModelShow1_plain.objects.get(field1="TestParentLinkAndRelatedName")
|
||||
p = ModelShow1_plain.objects.get(field1="ParentLinkAndRelatedName")
|
||||
|
||||
# check that p is equal to the
|
||||
assert isinstance(p, TestParentLinkAndRelatedName)
|
||||
assert isinstance(p, ParentLinkAndRelatedName)
|
||||
assert p == t
|
||||
|
||||
# check that the accessors to parent and sublass work correctly and return the right object
|
||||
p = ModelShow1_plain.objects.non_polymorphic().get(field1="TestParentLinkAndRelatedName")
|
||||
# p should be Plain1 and t TestParentLinkAndRelatedName, so not equal
|
||||
p = ModelShow1_plain.objects.non_polymorphic().get(field1="ParentLinkAndRelatedName")
|
||||
# p should be Plain1 and t ParentLinkAndRelatedName, so not equal
|
||||
assert p != t
|
||||
assert p == t.superclass
|
||||
assert p.related_name_subclass == t
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user