1313from polymorphic .managers import PolymorphicManager
1414from polymorphic .models import PolymorphicTypeInvalid , PolymorphicTypeUndefined
1515from polymorphic .tests .models import (
16+ AliasProxyChild ,
1617 ArtProject ,
1718 Base ,
1819 BlogA ,
9495 UUIDResearchProject ,
9596 Duck ,
9697 PurpleHeadDuck ,
98+ NonAliasNonProxyChild ,
99+ TradProxyOnProxyChild ,
100+ TradProxyChild ,
101+ AliasOfNonProxyChild ,
102+ ProxyChildAliasProxy ,
97103)
98104
99105
@@ -867,6 +873,58 @@ def test_queryset_on_proxy_model_does_not_return_superclasses(self):
867873 assert ProxyBase .objects .count () == 5
868874 assert ProxyChild .objects .count () == 3
869875
876+ def test_queryset_on_polymorphic_proxy_model_returns_superclasses (self ):
877+ ProxyBase .objects .create (some_data = "Base1" )
878+ AliasProxyChild .objects .create (some_data = "ProxyChild1" )
879+ AliasProxyChild .objects .create (some_data = "ProxyChild2" )
880+ ProxyChild .objects .create (some_data = "PolyChild1" )
881+ NonAliasNonProxyChild .objects .create (some_data = "SubChild1" )
882+ NonAliasNonProxyChild .objects .create (some_data = "SubChild2" )
883+ NonProxyChild .objects .create (some_data = "NonProxyChild1" , name = "t1" )
884+
885+ with self .subTest ("superclasses" ):
886+ self .assertEqual (7 , ProxyBase .objects .count ())
887+ self .assertEqual (7 , AliasProxyChild .objects .count ())
888+ with self .subTest ("only complete classes" ):
889+ # Non proxy models should not return the proxy siblings
890+ self .assertEqual (1 , ProxyChild .objects .count ())
891+ self .assertEqual (2 , NonAliasNonProxyChild .objects .count ())
892+ self .assertEqual (3 , NonProxyChild .objects .count ())
893+
894+ def test_polymorphic_proxy_object_has_different_ctype_from_base (self ):
895+ obj1 = ProxyBase .objects .create (some_data = "Base1" )
896+ obj2 = AliasProxyChild .objects .create (some_data = "ProxyChild1" )
897+ obj1_ctype = ContentType .objects .get_for_model (obj1 , for_concrete_model = False )
898+ obj2_ctype = ContentType .objects .get_for_model (obj2 , for_concrete_model = False )
899+ self .assertNotEqual (obj1_ctype , obj2_ctype )
900+
901+ def test_can_create_django_style_proxy_classes_alias (self ):
902+ ProxyBase .objects .create (some_data = "Base1" )
903+ TradProxyChild .objects .create (some_data = "Base2" )
904+ self .assertEqual (2 , ProxyBase .objects .count ())
905+ self .assertEqual (2 , TradProxyChild .objects .count ())
906+ TradProxyOnProxyChild .objects .create ()
907+
908+ def test_convert_back_to_django_style_from_polymorphic (self ):
909+ ProxyBase .objects .create (some_data = "Base1" )
910+ ProxyChild .objects .create (some_data = "Base1" )
911+ TradProxyOnProxyChild .objects .create (some_data = "Base3" )
912+ self .assertEqual (3 , ProxyBase .objects .count ())
913+ self .assertEqual (2 , ProxyChild .objects .count ())
914+ self .assertEqual (3 , TradProxyOnProxyChild .objects .count ())
915+
916+ def test_convert_back_to_django_style_from_polymorphic_stops_at_concrete (self ):
917+ ProxyBase .objects .create (some_data = "Base1" )
918+ NonProxyChild .objects .create (some_data = "Base1" )
919+ AliasOfNonProxyChild .objects .create (some_data = "Base1" )
920+
921+ self .assertEqual (3 , ProxyBase .objects .count ())
922+ self .assertEqual (2 , NonProxyChild .objects .count ())
923+ self .assertEqual (2 , AliasOfNonProxyChild .objects .count ())
924+
925+ def test_revert_back_to_polymorphic_proxy (self ):
926+ self .assertFalse (ProxyChildAliasProxy ._meta .polymorphic__proxy )
927+
870928 def test_proxy_get_real_instance_class (self ):
871929 """
872930 The call to ``get_real_instance()`` also checks whether the returned model is of the correct type.
@@ -876,12 +934,12 @@ def test_proxy_get_real_instance_class(self):
876934 name = "Item1"
877935 nonproxychild = NonProxyChild .objects .create (name = name )
878936
879- pb = ProxyBase .objects .get (id = 1 )
937+ pb = ProxyBase .objects .get (id = nonproxychild . pk )
880938 assert pb .get_real_instance_class () == NonProxyChild
881939 assert pb .get_real_instance () == nonproxychild
882940 assert pb .name == name
883941
884- pbm = NonProxyChild .objects .get (id = 1 )
942+ pbm = NonProxyChild .objects .get (id = nonproxychild . pk )
885943 assert pbm .get_real_instance_class () == NonProxyChild
886944 assert pbm .get_real_instance () == nonproxychild
887945 assert pbm .name == name
0 commit comments