12
12
from polymorphic .managers import PolymorphicManager
13
13
from polymorphic .models import PolymorphicTypeInvalid , PolymorphicTypeUndefined
14
14
from polymorphic .tests .models import (
15
+ AliasProxyChild ,
15
16
ArtProject ,
16
17
Base ,
17
18
BlogA ,
88
89
UUIDPlainC ,
89
90
UUIDProject ,
90
91
UUIDResearchProject ,
92
+
93
+ NonAliasNonProxyChild ,
94
+ TradProxyOnProxyChild ,
95
+ TradProxyChild ,
96
+ AliasOfNonProxyChild ,
97
+ ProxyChildAliasProxy ,
98
+
91
99
)
92
100
93
101
@@ -859,6 +867,60 @@ def test_queryset_on_proxy_model_does_not_return_superclasses(self):
859
867
assert ProxyBase .objects .count () == 5
860
868
assert ProxyChild .objects .count () == 3
861
869
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
+
862
924
def test_proxy_get_real_instance_class (self ):
863
925
"""
864
926
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):
868
930
name = "Item1"
869
931
nonproxychild = NonProxyChild .objects .create (name = name )
870
932
871
- pb = ProxyBase .objects .get (id = 1 )
933
+ pb = ProxyBase .objects .get (id = nonproxychild . pk )
872
934
assert pb .get_real_instance_class () == NonProxyChild
873
935
assert pb .get_real_instance () == nonproxychild
874
936
assert pb .name == name
875
937
876
- pbm = NonProxyChild .objects .get (id = 1 )
938
+ pbm = NonProxyChild .objects .get (id = nonproxychild . pk )
877
939
assert pbm .get_real_instance_class () == NonProxyChild
878
940
assert pbm .get_real_instance () == nonproxychild
879
941
assert pbm .name == name
0 commit comments