add exclude_fields queryset method

This commit is contained in:
collerek
2020-11-10 16:54:24 +01:00
parent 9413e51e6e
commit eafc6862f4
11 changed files with 346 additions and 38 deletions

View File

@ -25,6 +25,7 @@ class SqlJoin:
select_from: sqlalchemy.sql.select,
columns: List[sqlalchemy.Column],
fields: List,
exclude_fields: List,
order_columns: Optional[List],
sorted_orders: OrderedDict,
) -> None:
@ -32,6 +33,7 @@ class SqlJoin:
self.select_from = select_from
self.columns = columns
self.fields = fields
self.exclude_fields = exclude_fields
self.order_columns = order_columns
self.sorted_orders = sorted_orders
@ -121,7 +123,7 @@ class SqlJoin:
self.get_order_bys(alias, to_table, pkname_alias, part)
self_related_fields = model_cls.own_table_columns(
model_cls, self.fields, nested=True,
model_cls, self.fields, self.exclude_fields, nested=True,
)
self.columns.extend(
self.relation_manager(model_cls).prefixed_columns(

View File

@ -22,6 +22,7 @@ class Query:
limit_count: Optional[int],
offset: Optional[int],
fields: Optional[List],
exclude_fields: Optional[List],
order_bys: Optional[List],
) -> None:
self.query_offset = offset
@ -30,6 +31,7 @@ class Query:
self.filter_clauses = filter_clauses[:]
self.exclude_clauses = exclude_clauses[:]
self.fields = fields[:] if fields else []
self.exclude_fields = exclude_fields[:] if exclude_fields else []
self.model_cls = model_cls
self.table = self.model_cls.Meta.table
@ -68,7 +70,7 @@ class Query:
def build_select_expression(self) -> Tuple[sqlalchemy.sql.select, List[str]]:
self_related_fields = self.model_cls.own_table_columns(
self.model_cls, self.fields
self.model_cls, self.fields, self.exclude_fields
)
self.columns = self.model_cls.Meta.alias_manager.prefixed_columns(
"", self.table, self_related_fields
@ -88,6 +90,7 @@ class Query:
select_from=self.select_from,
columns=self.columns,
fields=self.fields,
exclude_fields=self.exclude_fields,
order_columns=self.order_columns,
sorted_orders=self.sorted_orders,
)
@ -126,3 +129,4 @@ class Query:
self.columns = []
self.used_aliases = []
self.fields = []
self.exclude_fields = []

View File

@ -27,6 +27,7 @@ class QuerySet:
limit_count: int = None,
offset: int = None,
columns: List = None,
exclude_columns: List = None,
order_bys: List = None,
) -> None:
self.model_cls = model_cls
@ -36,6 +37,7 @@ class QuerySet:
self.limit_count = limit_count
self.query_offset = offset
self._columns = columns or []
self._exclude_columns = exclude_columns or []
self.order_bys = order_bys or []
def __get__(
@ -63,7 +65,10 @@ class QuerySet:
def _process_query_result_rows(self, rows: List) -> Sequence[Optional["Model"]]:
result_rows = [
self.model.from_row(
row, select_related=self._select_related, fields=self._columns
row=row,
select_related=self._select_related,
fields=self._columns,
exclude_fields=self._exclude_columns,
)
for row in rows
]
@ -111,6 +116,7 @@ class QuerySet:
offset=self.query_offset,
limit_count=self.limit_count,
fields=self._columns,
exclude_fields=self._exclude_columns,
order_bys=self.order_bys,
)
exp = qry.build_select_expression()
@ -139,6 +145,7 @@ class QuerySet:
limit_count=self.limit_count,
offset=self.query_offset,
columns=self._columns,
exclude_columns=self._exclude_columns,
order_bys=self.order_bys,
)
@ -158,6 +165,24 @@ class QuerySet:
limit_count=self.limit_count,
offset=self.query_offset,
columns=self._columns,
exclude_columns=self._exclude_columns,
order_bys=self.order_bys,
)
def exclude_fields(self, columns: Union[List, str]) -> "QuerySet":
if not isinstance(columns, list):
columns = [columns]
columns = list(set(list(self._exclude_columns) + columns))
return self.__class__(
model_cls=self.model,
filter_clauses=self.filter_clauses,
exclude_clauses=self.exclude_clauses,
select_related=self._select_related,
limit_count=self.limit_count,
offset=self.query_offset,
columns=self._columns,
exclude_columns=columns,
order_bys=self.order_bys,
)
@ -174,6 +199,7 @@ class QuerySet:
limit_count=self.limit_count,
offset=self.query_offset,
columns=columns,
exclude_columns=self._exclude_columns,
order_bys=self.order_bys,
)
@ -190,6 +216,7 @@ class QuerySet:
limit_count=self.limit_count,
offset=self.query_offset,
columns=self._columns,
exclude_columns=self._exclude_columns,
order_bys=order_bys,
)
@ -239,6 +266,7 @@ class QuerySet:
limit_count=limit_count,
offset=self.query_offset,
columns=self._columns,
exclude_columns=self._exclude_columns,
order_bys=self.order_bys,
)
@ -251,6 +279,7 @@ class QuerySet:
limit_count=self.limit_count,
offset=offset,
columns=self._columns,
exclude_columns=self._exclude_columns,
order_bys=self.order_bys,
)