@@ -730,6 +730,136 @@ class Meta:
730
730
editor .delete_model (Book )
731
731
self .assertTableNotExists (Book )
732
732
733
+ @isolate_apps ("schema_" )
734
+ def test_add_remove_inner_field_indexes (self ):
735
+ """AddField/RemoveField + EmbeddedModelField + Meta.indexes at inner level."""
736
+
737
+ class Address (EmbeddedModel ):
738
+ indexed_one = models .CharField (max_length = 10 )
739
+
740
+ class Meta :
741
+ app_label = "schema_"
742
+
743
+ class Author (EmbeddedModel ):
744
+ address = EmbeddedModelField (Address )
745
+ indexed_two = models .CharField (max_length = 10 )
746
+
747
+ class Meta :
748
+ app_label = "schema_"
749
+
750
+ class Book (models .Model ):
751
+ author = EmbeddedModelField (Author )
752
+
753
+ class Meta :
754
+ app_label = "schema_"
755
+ indexes = [
756
+ models .Index (fields = ["author__indexed_two" ]),
757
+ models .Index (fields = ["author__address__indexed_one" ]),
758
+ ]
759
+
760
+ new_field = EmbeddedModelField (Address )
761
+ new_field .set_attributes_from_name ("address" )
762
+
763
+ with connection .schema_editor () as editor :
764
+ # Create the table and add the field.
765
+ editor .create_model (Book )
766
+ editor .add_field (Author , new_field )
767
+ # Embedded indexes are created.
768
+ self .assertEqual (
769
+ self .get_constraints_for_columns (Book , ["author.indexed_two" ]),
770
+ ["schema__boo_author._333c90_idx" ],
771
+ )
772
+ self .assertEqual (
773
+ self .get_constraints_for_columns (
774
+ Book ,
775
+ ["author.address.indexed_one" ],
776
+ ),
777
+ ["schema__boo_author._f54386_idx" ],
778
+ )
779
+ editor .remove_field (Book , new_field )
780
+ # Embedded indexes are removed.
781
+ self .assertEqual (
782
+ self .get_constraints_for_columns (Book , ["author.indexed_two" ]),
783
+ ["schema__boo_author._333c90_idx" ],
784
+ )
785
+ self .assertEqual (
786
+ self .get_constraints_for_columns (
787
+ Book ,
788
+ ["author.address.indexed_one" ],
789
+ ),
790
+ [],
791
+ )
792
+ editor .delete_model (Book )
793
+ self .assertTableNotExists (Book )
794
+
795
+ @isolate_apps ("schema_" )
796
+ def test_add_remove_inner_field_constraints (self ):
797
+ """AddField/RemoveField + EmbeddedModelField + Meta.constraints at top-level."""
798
+
799
+ class Address (EmbeddedModel ):
800
+ unique_constraint_one = models .CharField (max_length = 10 )
801
+
802
+ class Meta :
803
+ app_label = "schema_"
804
+
805
+ class Author (EmbeddedModel ):
806
+ address = EmbeddedModelField (Address )
807
+ unique_constraint_two = models .CharField (max_length = 10 )
808
+
809
+ class Meta :
810
+ app_label = "schema_"
811
+
812
+ class Book (models .Model ):
813
+ author = EmbeddedModelField (Author )
814
+
815
+ class Meta :
816
+ app_label = "schema_"
817
+ constraints = [
818
+ models .UniqueConstraint (
819
+ fields = ["author__unique_constraint_two" ],
820
+ name = "unique_two" ,
821
+ ),
822
+ models .UniqueConstraint (
823
+ fields = ["author__address__unique_constraint_one" ],
824
+ name = "unique_one" ,
825
+ ),
826
+ ]
827
+
828
+ new_field = EmbeddedModelField (Address )
829
+ new_field .set_attributes_from_name ("address" )
830
+
831
+ with connection .schema_editor () as editor :
832
+ # Create the table and add the field.
833
+ editor .create_model (Book )
834
+ editor .add_field (Author , new_field )
835
+ # Embedded constraints are created.
836
+ self .assertEqual (
837
+ self .get_constraints_for_columns (Book , ["author.unique_constraint_two" ]),
838
+ ["unique_two" ],
839
+ )
840
+ self .assertEqual (
841
+ self .get_constraints_for_columns (
842
+ Book ,
843
+ ["author.address.unique_constraint_one" ],
844
+ ),
845
+ ["unique_one" ],
846
+ )
847
+ editor .remove_field (Book , new_field )
848
+ # Embedded constraints are removed.
849
+ self .assertEqual (
850
+ self .get_constraints_for_columns (Book , ["author.unique_constraint_two" ]),
851
+ ["unique_two" ],
852
+ )
853
+ self .assertEqual (
854
+ self .get_constraints_for_columns (
855
+ Book ,
856
+ ["author.address.unique_constraint_one" ],
857
+ ),
858
+ [],
859
+ )
860
+ editor .delete_model (Book )
861
+ self .assertTableNotExists (Book )
862
+
733
863
734
864
class EmbeddedModelsIgnoredTests (TestMixin , TransactionTestCase ):
735
865
def test_embedded_not_created (self ):
0 commit comments