Skip to content

Commit b28e3a4

Browse files
committed
add/remove field complete
1 parent 0012479 commit b28e3a4

File tree

2 files changed

+98
-17
lines changed

2 files changed

+98
-17
lines changed

django_mongodb/schema.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,12 +205,10 @@ def _remove_model_indexes(self, model, column_prefix="", parent_model=None):
205205
)
206206
# Meta.constraints
207207
for constraint in model._meta.constraints:
208-
self.remove_constraint(
209-
model, constraint, column_prefix=column_prefix, parent_model=parent_model
210-
)
208+
self.remove_constraint(parent_model or model, constraint)
211209
# Meta.indexes
212210
for index in model._meta.indexes:
213-
self.remove_index(model, index, column_prefix=column_prefix, parent_model=parent_model)
211+
self.remove_index(parent_model or model, index)
214212

215213
def alter_index_together(self, model, old_index_together, new_index_together, column_prefix=""):
216214
olds = {tuple(fields) for fields in old_index_together}

tests/schema_/test_embedded_model.py

Lines changed: 96 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,7 @@ class Meta:
542542
new_field = EmbeddedModelField(Author)
543543
new_field.set_attributes_from_name("author")
544544
with connection.schema_editor() as editor:
545-
# Create the table amd add the field.
545+
# Create the table and add the field.
546546
editor.create_model(Book)
547547
editor.add_field(Book, new_field)
548548
# Embedded uniques are created.
@@ -582,40 +582,123 @@ class Meta:
582582
self.assertTableNotExists(Book)
583583

584584
@isolate_apps("schema_")
585-
def _test_add_field_db_index(self):
586-
"""AddField + EmbeddedModelField"""
585+
def test_add_remove_field_indexes(self):
586+
"""AddField/RemoveField + EmbeddedModelField + Meta.indexes."""
587+
588+
class Address(models.Model):
589+
indexed_one = models.CharField(max_length=10)
590+
591+
class Meta:
592+
app_label = "schema_"
593+
indexes = [models.Index(fields=["indexed_one"])]
594+
595+
class Author(models.Model):
596+
address = EmbeddedModelField(Address)
597+
indexed_two = models.CharField(max_length=10)
598+
599+
class Meta:
600+
app_label = "schema_"
601+
indexes = [models.Index(fields=["indexed_two"])]
587602

588603
class Book(models.Model):
589-
name = models.CharField(max_length=100)
604+
author = EmbeddedModelField(Author)
590605

591606
class Meta:
592607
app_label = "schema_"
593608

594609
new_field = EmbeddedModelField(Author)
595610
new_field.set_attributes_from_name("author")
596-
597611
with connection.schema_editor() as editor:
598-
# Create the table amd add the field.
612+
# Create the table and add the field.
599613
editor.create_model(Book)
600614
editor.add_field(Book, new_field)
601615
# Embedded indexes are created.
602616
self.assertEqual(
603-
self.get_constraints_for_columns(Book, ["author.age"]),
604-
["schema__book_author.age_dc08100b"],
617+
self.get_constraints_for_columns(Book, ["author.indexed_two"]),
618+
["schema__aut_indexed_b19137_idx"],
605619
)
606620
self.assertEqual(
607-
self.get_constraints_for_columns(Book, ["author.address.zip_code"]),
608-
["schema__book_author.address.zip_code_7b9a9307"],
621+
self.get_constraints_for_columns(
622+
Book,
623+
["author.address.indexed_one"],
624+
),
625+
["schema__add_indexed_b64972_idx"],
609626
)
610627
editor.remove_field(Book, new_field)
611628
# Embedded indexes are removed.
612629
self.assertEqual(
613-
self.get_constraints_for_columns(Book, ["author.age"]),
630+
self.get_constraints_for_columns(Book, ["author.indexed_two"]),
614631
[],
615632
)
616633
self.assertEqual(
617-
self.get_constraints_for_columns(Book, ["author.address.zip_code"]),
634+
self.get_constraints_for_columns(
635+
Book,
636+
["author.address.indexed_one"],
637+
),
618638
[],
619639
)
620-
editor.delete_model(Book)
640+
editor.delete_model(Author)
641+
self.assertTableNotExists(Author)
642+
643+
@isolate_apps("schema_")
644+
def test_add_remove_field_constraints(self):
645+
"""AddField/RemoveField + EmbeddedModelField + Meta.constraints."""
646+
647+
class Address(models.Model):
648+
unique_constraint_one = models.CharField(max_length=10)
649+
650+
class Meta:
651+
app_label = "schema_"
652+
constraints = [
653+
models.UniqueConstraint(fields=["unique_constraint_one"], name="unique_one")
654+
]
655+
656+
class Author(models.Model):
657+
address = EmbeddedModelField(Address)
658+
unique_constraint_two = models.CharField(max_length=10)
659+
660+
class Meta:
661+
app_label = "schema_"
662+
constraints = [
663+
models.UniqueConstraint(fields=["unique_constraint_two"], name="unique_two")
664+
]
665+
666+
class Book(models.Model):
667+
author = EmbeddedModelField(Author)
668+
669+
class Meta:
670+
app_label = "schema_"
671+
672+
new_field = EmbeddedModelField(Author)
673+
new_field.set_attributes_from_name("author")
674+
with connection.schema_editor() as editor:
675+
# Create the table and add the field.
676+
editor.create_model(Book)
677+
editor.add_field(Book, new_field)
678+
# Embedded constraints are created.
679+
self.assertEqual(
680+
self.get_constraints_for_columns(Book, ["author.unique_constraint_two"]),
681+
["unique_two"],
682+
)
683+
self.assertEqual(
684+
self.get_constraints_for_columns(
685+
Book,
686+
["author.address.unique_constraint_one"],
687+
),
688+
["unique_one"],
689+
)
690+
editor.remove_field(Book, new_field)
691+
# Embedded constraints are removed.
692+
self.assertEqual(
693+
self.get_constraints_for_columns(Book, ["author.unique_constraint_two"]),
694+
[],
695+
)
696+
self.assertEqual(
697+
self.get_constraints_for_columns(
698+
Book,
699+
["author.address.unique_constraint_one"],
700+
),
701+
[],
702+
)
703+
editor.delete_model(Author)
621704
self.assertTableNotExists(Author)

0 commit comments

Comments
 (0)