Define indexes on Embedded Models in Top-Level Model

XMLWordPrintableJSON

    • None
    • Python Drivers
    • Hide

      1. What would you like to communicate to the user about this feature?
      2. Would you like the user to see examples of the syntax and/or executable code and its output?
      3. Which versions of the driver/connector does this apply to?

      Show
      1. What would you like to communicate to the user about this feature? 2. Would you like the user to see examples of the syntax and/or executable code and its output? 3. Which versions of the driver/connector does this apply to?
    • None
    • None
    • None
    • None
    • None
    • None

      Context

      Currently, if a user wants to define an index on an embedded field within a model, they have to do this within the `EmbeddedModel` abstraction. Conceptually this doesn't make sense as EmbeddedModels are not collections themselves, so they allow for reusability between top-level models. We did this at first because top level models validate the existence of a field and there existed built-in method to validate embedded fields prior to the django-mongodb-backend. We need to change this to support index definitions at top-level embedded models.

       

       

      class Address(EmbeddedModel):
          unique_constraint_one = models.CharField(max_length=10)
      class Author(EmbeddedModel):
          address = EmbeddedModelField(Address)
          unique_constraint_two = models.CharField(max_length=10)
      class Book(models.Model):
          author = EmbeddedModelField(Author)
          class Meta:
              constraints = [
                  models.UniqueConstraint(
                      fields=["author.unique_constraint_two"],
                      name="unique_two",
                  ),
                  models.UniqueConstraint(
                      fields=["author.address.unique_constraint_one"],
                      name="unique_one",
                  ),
              ]
      

      Definition of done

      Change the above to support this syntax:

       

       

      class Address(EmbeddedModel):
          unique_together_one = models.CharField(max_length=10)
          unique_together_two = models.CharField(max_length=10)
          class Meta:
              app_label = "schema_"
      class Author(EmbeddedModel):
          address = EmbeddedModelField(Address)
          unique_together_three = models.CharField(max_length=10)
          unique_together_four = models.CharField(max_length=10)
          class Meta:
              app_label = "schema_"
      class Book(models.Model):
          author = EmbeddedModelField(Author)
          class Meta:
              app_label = "schema_"
              constraints = [
                  models.UniqueConstraint(
                      F("author__unique_together_three").asc(),
                      F("author__unique_together_four").desc(),
                      name="unique_together_34",
                  ),
                  (
                      models.UniqueConstraint(
                          F("author_address_unique_together_one"),
                          F("author_address_unique_together_two").asc(),
                          name="unique_together_12",
                      )
                  ),
              ]
       
      

       

      Pitfalls

      Using `F` expressions may be cumbersome in the eyes of the end-user. As a mitigation we could implement a light wrapper (afterwards) that converts dot notation (mongodb's standard way of identifying subfields) into `__` notation. 

            Assignee:
            Emanuel Lupi
            Reporter:
            Jib Adegunloye
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated: