1212from polymorphic .managers import PolymorphicManager
1313from polymorphic .models import PolymorphicTypeInvalid , PolymorphicTypeUndefined
1414from polymorphic .tests .models import (
15+ AliasProxyChild ,
1516 ArtProject ,
1617 Base ,
1718 BlogA ,
8889 UUIDPlainC ,
8990 UUIDProject ,
9091 UUIDResearchProject ,
92+
93+ NonAliasNonProxyChild ,
94+ TradProxyOnProxyChild ,
95+ TradProxyChild ,
96+ AliasOfNonProxyChild ,
97+ ProxyChildAliasProxy ,
98+
9199)
92100
93101
@@ -859,6 +867,60 @@ def test_queryset_on_proxy_model_does_not_return_superclasses(self):
859867 assert ProxyBase .objects .count () == 5
860868 assert ProxyChild .objects .count () == 3
861869
870+ def test_queryset_on_polymorphic_proxy_model_returns_superclasses (self ):
871+ ProxyBase .objects .create (some_data = "Base1" )
872+ AliasProxyChild .objects .create (some_data = "ProxyChild1" )
873+ AliasProxyChild .objects .create (some_data = "ProxyChild2" )
874+ ProxyChild .objects .create (some_data = "PolyChild1" )
875+ NonAliasNonProxyChild .objects .create (some_data = "SubChild1" )
876+ NonAliasNonProxyChild .objects .create (some_data = "SubChild2" )
877+ NonProxyChild .objects .create (some_data = "NonProxChild1" , name = "t1" )
878+
879+ with self .subTest (" superclasses" ):
880+ self .assertEqual (7 , ProxyBase .objects .count ())
881+ self .assertEqual (7 , AliasProxyChild .objects .count ())
882+ with self .subTest ("only compete classes" ):
883+ # Non proxy models should not return the proxy siblings
884+ self .assertEqual (1 , ProxyChild .objects .count ())
885+ self .assertEqual (2 , NonAliasNonProxyChild .objects .count ())
886+ self .assertEqual (3 , NonProxyChild .objects .count ())
887+
888+ def test_polymorphic_proxy_object_has_different_ctype_from_base (self ):
889+ obj1 = ProxyBase .objects .create (some_data = "Base1" )
890+ obj2 = AliasProxyChild .objects .create (some_data = "ProxyChild1" )
891+ obj1_ctype = ContentType .objects .get_for_model (
892+ obj1 , for_concrete_model = False )
893+ obj2_ctype = ContentType .objects .get_for_model (
894+ obj2 , for_concrete_model = False )
895+ self .assertNotEqual (obj1_ctype , obj2_ctype )
896+
897+ def test_can_create_django_style_proxy_classes_alias (self ):
898+ ProxyBase .objects .create (some_data = "Base1" )
899+ TradProxyChild .objects .create (some_data = "Base2" )
900+ self .assertEqual (2 , ProxyBase .objects .count ())
901+ self .assertEqual (2 , TradProxyChild .objects .count ())
902+ TradProxyOnProxyChild .objects .create ()
903+
904+ def test_convert_back_to_django_style_from_polymorphic (self ):
905+ ProxyBase .objects .create (some_data = "Base1" )
906+ ProxyChild .objects .create (some_data = "Base1" )
907+ TradProxyOnProxyChild .objects .create (some_data = "Base3" )
908+ self .assertEqual (3 , ProxyBase .objects .count ())
909+ self .assertEqual (2 , ProxyChild .objects .count ())
910+ self .assertEqual (3 , TradProxyOnProxyChild .objects .count ())
911+
912+ def test_convert_back_to_django_style_from_polymorphic_stops_at_concrete (self ):
913+ ProxyBase .objects .create (some_data = "Base1" )
914+ NonProxyChild .objects .create (some_data = "Base1" )
915+ AliasOfNonProxyChild .objects .create (some_data = "Base1" )
916+
917+ self .assertEqual (3 , ProxyBase .objects .count ())
918+ self .assertEqual (2 , NonProxyChild .objects .count ())
919+ self .assertEqual (2 , AliasOfNonProxyChild .objects .count ())
920+
921+ def test_revert_back_to_polymorphic_proxy (self ):
922+ self .assertFalse (ProxyChildAliasProxy ._meta .polymorphic__proxy )
923+
862924 def test_proxy_get_real_instance_class (self ):
863925 """
864926 The call to ``get_real_instance()`` also checks whether the returned model is of the correct type.
@@ -868,12 +930,12 @@ def test_proxy_get_real_instance_class(self):
868930 name = "Item1"
869931 nonproxychild = NonProxyChild .objects .create (name = name )
870932
871- pb = ProxyBase .objects .get (id = 1 )
933+ pb = ProxyBase .objects .get (id = nonproxychild . pk )
872934 assert pb .get_real_instance_class () == NonProxyChild
873935 assert pb .get_real_instance () == nonproxychild
874936 assert pb .name == name
875937
876- pbm = NonProxyChild .objects .get (id = 1 )
938+ pbm = NonProxyChild .objects .get (id = nonproxychild . pk )
877939 assert pbm .get_real_instance_class () == NonProxyChild
878940 assert pbm .get_real_instance () == nonproxychild
879941 assert pbm .name == name
0 commit comments