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"), )
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
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()
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"), )
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, ), )
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), ), )
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()
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)
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 ]
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]
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 ]
def list_pk_encoder(values, instance, field: Field): return [field.db_value(getattr(v, "pk", v), instance) for v in values]