Fix enum schema (#715)
* fix schema with enum fields - issue #699 * fix drivers dependencies - make them optional * fix command * provide extras * add bolean field to related model * add test with select related and boolean * new test case based on issue * fix bool issue in postgres limit queries - issue #704 * fix coverage * bump version and add release info
This commit is contained in:
@ -150,7 +150,7 @@ class ModelFieldFactory:
|
||||
scale=kwargs.get("scale", None),
|
||||
represent_as_str=kwargs.get("represent_as_base64_str", False),
|
||||
)
|
||||
enum_class = kwargs.get("enum_class", None)
|
||||
enum_class = kwargs.pop("enum_class", None)
|
||||
field_type = cls._type if enum_class is None else enum_class
|
||||
|
||||
namespace = dict(
|
||||
@ -170,7 +170,9 @@ class ModelFieldFactory:
|
||||
unique=kwargs.pop("unique", False),
|
||||
pydantic_only=pydantic_only,
|
||||
autoincrement=autoincrement,
|
||||
column_type=cls.get_column_type(**kwargs, sql_nullable=sql_nullable),
|
||||
column_type=cls.get_column_type(
|
||||
**kwargs, sql_nullable=sql_nullable, enum_class=enum_class
|
||||
),
|
||||
choices=choices,
|
||||
encrypt_secret=encrypt_secret,
|
||||
encrypt_backend=encrypt_backend,
|
||||
|
||||
@ -34,6 +34,12 @@ class OrderAction(QueryAction):
|
||||
def field_alias(self) -> str:
|
||||
return self.target_model.get_column_alias(self.field_name)
|
||||
|
||||
@property
|
||||
def is_postgres_bool(self) -> bool:
|
||||
dialect = self.target_model.Meta.database._backend._dialect.name
|
||||
field_type = self.target_model.Meta.model_fields[self.field_name].__type__
|
||||
return dialect == "postgresql" and field_type == bool
|
||||
|
||||
def get_field_name_text(self) -> str:
|
||||
"""
|
||||
Escapes characters if it's required.
|
||||
@ -49,15 +55,19 @@ class OrderAction(QueryAction):
|
||||
def get_min_or_max(self) -> sqlalchemy.sql.expression.TextClause:
|
||||
"""
|
||||
Used in limit sub queries where you need to use aggregated functions
|
||||
in order to order by columns not included in group by.
|
||||
in order to order by columns not included in group by. For postgres bool
|
||||
field it's using bool_or function as aggregates does not work with this type
|
||||
of columns.
|
||||
|
||||
:return: min or max function to order
|
||||
:rtype: sqlalchemy.sql.elements.TextClause
|
||||
"""
|
||||
prefix = f"{self.table_prefix}_" if self.table_prefix else ""
|
||||
if self.direction == "":
|
||||
return text(f"min({prefix}{self.table}" f".{self.field_alias})")
|
||||
return text(f"max({prefix}{self.table}" f".{self.field_alias}) desc")
|
||||
function = "min" if not self.is_postgres_bool else "bool_or"
|
||||
return text(f"{function}({prefix}{self.table}" f".{self.field_alias})")
|
||||
function = "max" if not self.is_postgres_bool else "bool_or"
|
||||
return text(f"{function}({prefix}{self.table}" f".{self.field_alias}) desc")
|
||||
|
||||
def get_text_clause(self) -> sqlalchemy.sql.expression.TextClause:
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user