1414from polymorphic .managers import PolymorphicManager
1515from polymorphic .models import PolymorphicTypeInvalid , PolymorphicTypeUndefined
1616from polymorphic .tests .models import (
17+ AliasProxyChild ,
1718 ArtProject ,
1819 Base ,
1920 BlogA ,
99100 SpecialAccount1 ,
100101 SpecialAccount1_1 ,
101102 SpecialAccount2 ,
103+ NonAliasNonProxyChild ,
104+ TradProxyOnProxyChild ,
105+ TradProxyChild ,
106+ AliasOfNonProxyChild ,
107+ ProxyChildAliasProxy ,
102108)
103109
104110
@@ -872,6 +878,58 @@ def test_queryset_on_proxy_model_does_not_return_superclasses(self):
872878 assert ProxyBase .objects .count () == 5
873879 assert ProxyChild .objects .count () == 3
874880
881+ def test_queryset_on_polymorphic_proxy_model_returns_superclasses (self ):
882+ ProxyBase .objects .create (some_data = "Base1" )
883+ AliasProxyChild .objects .create (some_data = "ProxyChild1" )
884+ AliasProxyChild .objects .create (some_data = "ProxyChild2" )
885+ ProxyChild .objects .create (some_data = "PolyChild1" )
886+ NonAliasNonProxyChild .objects .create (some_data = "SubChild1" )
887+ NonAliasNonProxyChild .objects .create (some_data = "SubChild2" )
888+ NonProxyChild .objects .create (some_data = "NonProxyChild1" , name = "t1" )
889+
890+ with self .subTest ("superclasses" ):
891+ self .assertEqual (7 , ProxyBase .objects .count ())
892+ self .assertEqual (7 , AliasProxyChild .objects .count ())
893+ with self .subTest ("only complete classes" ):
894+ # Non proxy models should not return the proxy siblings
895+ self .assertEqual (1 , ProxyChild .objects .count ())
896+ self .assertEqual (2 , NonAliasNonProxyChild .objects .count ())
897+ self .assertEqual (3 , NonProxyChild .objects .count ())
898+
899+ def test_polymorphic_proxy_object_has_different_ctype_from_base (self ):
900+ obj1 = ProxyBase .objects .create (some_data = "Base1" )
901+ obj2 = AliasProxyChild .objects .create (some_data = "ProxyChild1" )
902+ obj1_ctype = ContentType .objects .get_for_model (obj1 , for_concrete_model = False )
903+ obj2_ctype = ContentType .objects .get_for_model (obj2 , for_concrete_model = False )
904+ self .assertNotEqual (obj1_ctype , obj2_ctype )
905+
906+ def test_can_create_django_style_proxy_classes_alias (self ):
907+ ProxyBase .objects .create (some_data = "Base1" )
908+ TradProxyChild .objects .create (some_data = "Base2" )
909+ self .assertEqual (2 , ProxyBase .objects .count ())
910+ self .assertEqual (2 , TradProxyChild .objects .count ())
911+ TradProxyOnProxyChild .objects .create ()
912+
913+ def test_convert_back_to_django_style_from_polymorphic (self ):
914+ ProxyBase .objects .create (some_data = "Base1" )
915+ ProxyChild .objects .create (some_data = "Base1" )
916+ TradProxyOnProxyChild .objects .create (some_data = "Base3" )
917+ self .assertEqual (3 , ProxyBase .objects .count ())
918+ self .assertEqual (2 , ProxyChild .objects .count ())
919+ self .assertEqual (3 , TradProxyOnProxyChild .objects .count ())
920+
921+ def test_convert_back_to_django_style_from_polymorphic_stops_at_concrete (self ):
922+ ProxyBase .objects .create (some_data = "Base1" )
923+ NonProxyChild .objects .create (some_data = "Base1" )
924+ AliasOfNonProxyChild .objects .create (some_data = "Base1" )
925+
926+ self .assertEqual (3 , ProxyBase .objects .count ())
927+ self .assertEqual (2 , NonProxyChild .objects .count ())
928+ self .assertEqual (2 , AliasOfNonProxyChild .objects .count ())
929+
930+ def test_revert_back_to_polymorphic_proxy (self ):
931+ self .assertFalse (ProxyChildAliasProxy ._meta .polymorphic__proxy )
932+
875933 def test_proxy_get_real_instance_class (self ):
876934 """
877935 The call to ``get_real_instance()`` also checks whether the returned model is of the correct type.
@@ -881,12 +939,12 @@ def test_proxy_get_real_instance_class(self):
881939 name = "Item1"
882940 nonproxychild = NonProxyChild .objects .create (name = name )
883941
884- pb = ProxyBase .objects .get (id = 1 )
942+ pb = ProxyBase .objects .get (id = nonproxychild . pk )
885943 assert pb .get_real_instance_class () == NonProxyChild
886944 assert pb .get_real_instance () == nonproxychild
887945 assert pb .name == name
888946
889- pbm = NonProxyChild .objects .get (id = 1 )
947+ pbm = NonProxyChild .objects .get (id = nonproxychild . pk )
890948 assert pbm .get_real_instance_class () == NonProxyChild
891949 assert pbm .get_real_instance () == nonproxychild
892950 assert pbm .name == name
0 commit comments