Example #1
0
 def modify_column(self, model: "Type[Model]", field_object: Field):
     db_table = model._meta.db_table
     return self._MODIFY_COLUMN_TEMPLATE.format(
         table_name=db_table,
         column=field_object.model_field_name,
         datatype=field_object.get_for_dialect(self.DIALECT, "SQL_TYPE"),
     )
Example #2
0
 def _get_default(self, model: "Type[Model]", field_object: Field):
     db_table = model._meta.db_table
     default = field_object.default
     db_column = field_object.model_field_name
     auto_now_add = getattr(field_object, "auto_now_add", False)
     auto_now = getattr(field_object, "auto_now", False)
     if default is not None or auto_now_add:
         if callable(default) or isinstance(
                 field_object, (UUIDField, TextField, JSONField)):
             default = ""
         else:
             default = field_object.to_db_value(default, model)
             try:
                 default = self.schema_generator._column_default_generator(
                     db_table,
                     db_column,
                     self.schema_generator._escape_default_value(default),
                     auto_now_add,
                     auto_now,
                 )
             except NotImplementedError:
                 default = ""
     else:
         default = ""
     return default
Example #3
0
    def add_field(self, name: str, value: Field):
        if name in self.fields_map:
            raise ConfigurationError(
                "Field {} already present in meta".format(name))
        setattr(self._model, name, value)
        value.model = self._model
        self.fields_map[name] = value
        self._fields = None

        if value.has_db_field:
            self.fields_db_projection[name] = value.source_field or name
            self._fields_db_projection_reverse = None

        if isinstance(value, fields.ManyToManyField):
            self.m2m_fields.add(name)
            self._fetch_fields = None
        elif isinstance(value, fields.BackwardFKRelation):
            self.backward_fk_fields.add(name)
            self._fetch_fields = None

        field_filters = get_filters_for_field(field_name=name,
                                              field=value,
                                              source_field=value.source_field
                                              or name)
        self._filters.update(field_filters)
        self.generate_filters()
Example #4
0
 def _change_field(cls, model: Type[Model], old_field: Field,
                   new_field: Field):
     return cls.ddl.change_column(
         model,
         old_field.model_field_name,
         new_field.model_field_name,
         new_field.get_for_dialect(cls.dialect, "SQL_TYPE"),
     )
Example #5
0
 def add_column(self, model: "Type[Model]", field_object: Field):
     db_table = model._meta.db_table
     default = field_object.default
     db_column = field_object.model_field_name
     auto_now_add = getattr(field_object, "auto_now_add", False)
     auto_now = getattr(field_object, "auto_now", False)
     if default is not None or auto_now_add:
         if callable(default) or isinstance(
                 field_object, (UUIDField, TextField, JSONField)):
             default = ""
         else:
             default = field_object.to_db_value(default, model)
             try:
                 default = self.schema_generator._column_default_generator(
                     db_table,
                     db_column,
                     self.schema_generator._escape_default_value(default),
                     auto_now_add,
                     auto_now,
                 )
             except NotImplementedError:
                 default = ""
     else:
         default = ""
     return self._ADD_COLUMN_TEMPLATE.format(
         table_name=db_table,
         column=self.schema_generator._create_string(
             db_column=field_object.model_field_name,
             field_type=field_object.get_for_dialect(
                 self.DIALECT, "SQL_TYPE"),
             nullable="NOT NULL" if not field_object.null else "",
             unique="UNIQUE" if field_object.unique else "",
             comment=self.schema_generator._column_comment_generator(
                 table=db_table,
                 column=field_object.model_field_name,
                 comment=field_object.description,
             ) if field_object.description else "",
             is_primary_key=field_object.pk,
             default=default,
         ),
     )
Example #6
0
 def modify_column(self, model: "Type[Model]", field_object: Field):
     db_table = model._meta.db_table
     return self._MODIFY_COLUMN_TEMPLATE.format(
         table_name=db_table,
         column=self.schema_generator._create_string(
             db_column=field_object.model_field_name,
             field_type=field_object.get_for_dialect(
                 self.DIALECT, "SQL_TYPE"),
             nullable="NOT NULL" if not field_object.null else "",
             unique="",
             comment=self.schema_generator._column_comment_generator(
                 table=db_table,
                 column=field_object.model_field_name,
                 comment=field_object.description,
             ) if field_object.description else "",
             is_primary_key=field_object.pk,
             default=self._get_default(model, field_object),
         ),
     )
Example #7
0
    def add_field(self, name: str, value: Field):
        if name in self.fields_map:
            raise ConfigurationError(f"Field {name} already present in meta")
        value.model = self._model
        self.fields_map[name] = value

        if value.has_db_field:
            self.fields_db_projection[name] = value.source_field or name

        if isinstance(value, fields.ManyToManyField):
            self.m2m_fields.add(name)
        elif isinstance(value, fields.BackwardFKRelation):
            self.backward_fk_fields.add(name)

        field_filters = get_filters_for_field(
            field_name=name, field=value, source_field=value.source_field or name
        )
        self._filters.update(field_filters)
        self.finalise_fields()
Example #8
0
 def _field_to_db(cls, field_object: fields.Field, attr: Any,
                  instance) -> Any:
     if field_object.__class__ in cls.TO_DB_OVERRIDE:
         return cls.TO_DB_OVERRIDE[field_object.__class__](field_object,
                                                           attr, instance)
     return field_object.to_db_value(attr, instance)
Example #9
0
def related_list_encoder(values, instance, field: Field):
    return [
        field.to_db_value(element.pk if hasattr(element, "pk") else element,
                          instance) for element in values
    ]
Example #10
0
def list_encoder(values, instance, field: Field):
    """Encodes an iterable of a given field into a database-compatible format."""
    return [field.to_db_value(element, instance) for element in values]
Example #11
0
def related_list_encoder(values: Iterable[Any], instance: "Model",
                         field: Field) -> list:
    return [
        field.to_db_value(element.pk if hasattr(element, "pk") else element,
                          instance) for element in values
    ]
Example #12
0
def list_pk_encoder(values, instance, field: Field):
    return [field.db_value(getattr(v, "pk", v), instance) for v in values]