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
@@ -871,6 +877,58 @@ def test_queryset_on_proxy_model_does_not_return_superclasses(self):
871877 assert ProxyBase .objects .count () == 5
872878 assert ProxyChild .objects .count () == 3
873879
880+ def test_queryset_on_polymorphic_proxy_model_returns_superclasses (self ):
881+ ProxyBase .objects .create (some_data = "Base1" )
882+ AliasProxyChild .objects .create (some_data = "ProxyChild1" )
883+ AliasProxyChild .objects .create (some_data = "ProxyChild2" )
884+ ProxyChild .objects .create (some_data = "PolyChild1" )
885+ NonAliasNonProxyChild .objects .create (some_data = "SubChild1" )
886+ NonAliasNonProxyChild .objects .create (some_data = "SubChild2" )
887+ NonProxyChild .objects .create (some_data = "NonProxyChild1" , name = "t1" )
888+
889+ with self .subTest ("superclasses" ):
890+ self .assertEqual (7 , ProxyBase .objects .count ())
891+ self .assertEqual (7 , AliasProxyChild .objects .count ())
892+ with self .subTest ("only complete classes" ):
893+ # Non proxy models should not return the proxy siblings
894+ self .assertEqual (1 , ProxyChild .objects .count ())
895+ self .assertEqual (2 , NonAliasNonProxyChild .objects .count ())
896+ self .assertEqual (3 , NonProxyChild .objects .count ())
897+
898+ def test_polymorphic_proxy_object_has_different_ctype_from_base (self ):
899+ obj1 = ProxyBase .objects .create (some_data = "Base1" )
900+ obj2 = AliasProxyChild .objects .create (some_data = "ProxyChild1" )
901+ obj1_ctype = ContentType .objects .get_for_model (obj1 , for_concrete_model = False )
902+ obj2_ctype = ContentType .objects .get_for_model (obj2 , for_concrete_model = False )
903+ self .assertNotEqual (obj1_ctype , obj2_ctype )
904+
905+ def test_can_create_django_style_proxy_classes_alias (self ):
906+ ProxyBase .objects .create (some_data = "Base1" )
907+ TradProxyChild .objects .create (some_data = "Base2" )
908+ self .assertEqual (2 , ProxyBase .objects .count ())
909+ self .assertEqual (2 , TradProxyChild .objects .count ())
910+ TradProxyOnProxyChild .objects .create ()
911+
912+ def test_convert_back_to_django_style_from_polymorphic (self ):
913+ ProxyBase .objects .create (some_data = "Base1" )
914+ ProxyChild .objects .create (some_data = "Base1" )
915+ TradProxyOnProxyChild .objects .create (some_data = "Base3" )
916+ self .assertEqual (3 , ProxyBase .objects .count ())
917+ self .assertEqual (2 , ProxyChild .objects .count ())
918+ self .assertEqual (3 , TradProxyOnProxyChild .objects .count ())
919+
920+ def test_convert_back_to_django_style_from_polymorphic_stops_at_concrete (self ):
921+ ProxyBase .objects .create (some_data = "Base1" )
922+ NonProxyChild .objects .create (some_data = "Base1" )
923+ AliasOfNonProxyChild .objects .create (some_data = "Base1" )
924+
925+ self .assertEqual (3 , ProxyBase .objects .count ())
926+ self .assertEqual (2 , NonProxyChild .objects .count ())
927+ self .assertEqual (2 , AliasOfNonProxyChild .objects .count ())
928+
929+ def test_revert_back_to_polymorphic_proxy (self ):
930+ self .assertFalse (ProxyChildAliasProxy ._meta .polymorphic__proxy )
931+
874932 def test_proxy_get_real_instance_class (self ):
875933 """
876934 The call to ``get_real_instance()`` also checks whether the returned model is of the correct type.
@@ -880,12 +938,12 @@ def test_proxy_get_real_instance_class(self):
880938 name = "Item1"
881939 nonproxychild = NonProxyChild .objects .create (name = name )
882940
883- pb = ProxyBase .objects .get (id = 1 )
941+ pb = ProxyBase .objects .get (id = nonproxychild . pk )
884942 assert pb .get_real_instance_class () == NonProxyChild
885943 assert pb .get_real_instance () == nonproxychild
886944 assert pb .name == name
887945
888- pbm = NonProxyChild .objects .get (id = 1 )
946+ pbm = NonProxyChild .objects .get (id = nonproxychild . pk )
889947 assert pbm .get_real_instance_class () == NonProxyChild
890948 assert pbm .get_real_instance () == nonproxychild
891949 assert pbm .name == name
0 commit comments