Я пытаюсь создать собственный менеджер в среде отдыха django, который взаимодействует с athena. Хотя я сталкиваюсь со странной проблемой, заключающейся в том, что каждый раз, когда я обращаюсь к конечной точке с помощью фильтров, она добавляется в список where_conditions=[] при каждом запросе.
Этого не должно происходить, если запрос преобразуется в SQL недействителен. я хочу сбросить список where_conditions для каждого запроса.
filter_class/base.py
from apps.analytics.models.filter.fields.filter import FilterField
from apps.analytics.models.filter.fields.ordering import OrderingField
from apps.analytics.models.filter.fields.search import SearchField
from apps.analytics.models.manager.query.utils import ModelQueryUtils
class BaseFilterClass:
_ordering_filter_query_key = "ordering"
_search_filter_query_key = "search"
def __init__(self, request):
self._request = request
@property
def filter_params(self):
if getattr(self.Meta, "filter_fields", None):
req_query_params = {**self._request.query_params}
for i in req_query_params:
if isinstance(req_query_params, list):
req_query_params = req_query_params[0]
if req_query_params and req_query_params.get("search"):
del req_query_params["search"]
req_query_params_key = set(req_query_params.keys())
valid_filter_params = self.Meta.filter_fields.declared_filter_params.intersection(req_query_params_key)
params = {key: self.Meta.filter_fields.get_processed_value(key.split('__')[-1],
req_query_params[key]) if "__" in key else
req_query_params[key] for key in valid_filter_params}
return ModelQueryUtils.FilterInput(params, ModelQueryUtils.FilterInput.JoinOperator.AND)
@property
def ordering_params(self):
if getattr(self.Meta, "ordering_fields", None):
req_query_params_ordering_params = self._request.query_params and self._request.query_params.get(
self._ordering_filter_query_key)
if req_query_params_ordering_params:
declared_ordering_params = self.Meta.ordering_fields.declared_ordering_params
return ModelQueryUtils.OrderInput(
[str(param) for param in req_query_params_ordering_params.split(",") if
((param.startswith("-") and param[1:]) or param) in declared_ordering_params])
@property
def search_params(self):
if getattr(self.Meta, "search_fields", None):
req_query_params_search_param = self._request.query_params and self._request.query_params.get(
self._search_filter_query_key)
params = {}
if req_query_params_search_param:
for key in self.Meta.search_fields.declared_search_params:
params[key] = req_query_params_search_param
return ModelQueryUtils.SearchInput(params, ModelQueryUtils.FilterInput.JoinOperator.OR)
class Meta:
filter_fields = FilterField([])
search_fields = SearchField([])
ordering_fields = OrderingField([])
manager/query/base.py
class BaseModelQuery:
__slots__ = ['_model']
# _where_conditions = None
_order_conditions = None
_offset: int = None
_limit: int = None
_full_query_mtd_name: str = None
def __init__(self, model):
self._model = model
self._where_conditions = []
self._order_conditions = []
self._offset = None
self._limit = None
self._full_query_mtd_name = None
@property
def count_sql(self):
if self._full_query_mtd_name:
return getattr(self, self._full_query_mtd_name)()["count"]
return f"""
SELECT
Count(*)
FROM
{self._model.table_name}
{self._where_sql}
"""
@property
def full_sql(self):
if self._full_query_mtd_name:
return getattr(self, self._full_query_mtd_name)()["full"]
return f"""
{self._base_sql}
{self._where_sql}
{self._order_by_sql}
{self._offset_sql}
{self._limit_sql}
"""
@property
def _base_sql(self):
return f"""
SELECT
{','.join(field_name for field_name in self._model.fields.keys())}
FROM
{self._model.table_name}
"""
@property
def _where_sql(self):
if self._where_conditions:
statements = [item.get_sql_statement(self._model) for item in self._where_conditions]
print(statements)
statements = [f"({item})" for item in statements if item]
if statements:
return f"""
WHERE
{" AND ".join(statements)}
"""
return ""
@property
def _order_by_sql(self):
if self._order_conditions:
statements = [item.get_sql_statement() for item in self._order_conditions]
statements = [item for item in statements if item]
if statements:
return f"""
ORDER BY
{", ".join(statements)}
"""
return ""
@property
def _offset_sql(self):
if self._offset is not None:
return f"""
OFFSET {self._offset}
"""
return ""
@property
def _limit_sql(self):
if self._limit is not None:
return f"""
LIMIT {self._limit}
"""
return ""
def add_where(self, condition):
self._where_conditions.append(condition)
def add_order(self, condition):
self._order_conditions.append(condition)
def set_offset(self, offset: int):
self._offset = offset
def set_limit(self, limit: int):
self._limit = limit
def set_full_query_mtd_name(self, name: str):
self._full_query_mtd_name = name
manager/query/utils.py
from apps.analytics.models.fields import ModelField
from apps.analytics.models.filter.lookups import FilterFieldLookup
class ModelQueryUtils:
class FilterInput:
_filter_lookup_operator_mapping = {
FilterFieldLookup.Definition.NOT_EQUAL: "",
FilterFieldLookup.Definition.GREATER_THAN_EQUAL_TO: ">=",
FilterFieldLookup.Definition.LESS_THAN_EQUAL_TO: "",
FilterFieldLookup.Definition.LESS_THAN: "
Подробнее здесь: https://stackoverflow.com/questions/791 ... -resetting
В каждый список запросов API в методе add_where добавляется он не сбрасывается. ⇐ Python
Программы на Python
1731507008
Anonymous
Я пытаюсь создать собственный менеджер в среде отдыха django, который взаимодействует с athena. Хотя я сталкиваюсь со странной проблемой, заключающейся в том, что каждый раз, когда я обращаюсь к конечной точке с помощью фильтров, она добавляется в список [b]where_conditions=[][/b] при каждом запросе.
Этого не должно происходить, если запрос преобразуется в SQL недействителен. я хочу сбросить список [b]where_conditions[/b] для каждого запроса.
filter_class/base.py
from apps.analytics.models.filter.fields.filter import FilterField
from apps.analytics.models.filter.fields.ordering import OrderingField
from apps.analytics.models.filter.fields.search import SearchField
from apps.analytics.models.manager.query.utils import ModelQueryUtils
class BaseFilterClass:
_ordering_filter_query_key = "ordering"
_search_filter_query_key = "search"
def __init__(self, request):
self._request = request
@property
def filter_params(self):
if getattr(self.Meta, "filter_fields", None):
req_query_params = {**self._request.query_params}
for i in req_query_params:
if isinstance(req_query_params[i], list):
req_query_params[i] = req_query_params[i][0]
if req_query_params and req_query_params.get("search"):
del req_query_params["search"]
req_query_params_key = set(req_query_params.keys())
valid_filter_params = self.Meta.filter_fields.declared_filter_params.intersection(req_query_params_key)
params = {key: self.Meta.filter_fields.get_processed_value(key.split('__')[-1],
req_query_params[key]) if "__" in key else
req_query_params[key] for key in valid_filter_params}
return ModelQueryUtils.FilterInput(params, ModelQueryUtils.FilterInput.JoinOperator.AND)
@property
def ordering_params(self):
if getattr(self.Meta, "ordering_fields", None):
req_query_params_ordering_params = self._request.query_params and self._request.query_params.get(
self._ordering_filter_query_key)
if req_query_params_ordering_params:
declared_ordering_params = self.Meta.ordering_fields.declared_ordering_params
return ModelQueryUtils.OrderInput(
[str(param) for param in req_query_params_ordering_params.split(",") if
((param.startswith("-") and param[1:]) or param) in declared_ordering_params])
@property
def search_params(self):
if getattr(self.Meta, "search_fields", None):
req_query_params_search_param = self._request.query_params and self._request.query_params.get(
self._search_filter_query_key)
params = {}
if req_query_params_search_param:
for key in self.Meta.search_fields.declared_search_params:
params[key] = req_query_params_search_param
return ModelQueryUtils.SearchInput(params, ModelQueryUtils.FilterInput.JoinOperator.OR)
class Meta:
filter_fields = FilterField([])
search_fields = SearchField([])
ordering_fields = OrderingField([])
manager/query/base.py
class BaseModelQuery:
__slots__ = ['_model']
# _where_conditions = None
_order_conditions = None
_offset: int = None
_limit: int = None
_full_query_mtd_name: str = None
def __init__(self, model):
self._model = model
self._where_conditions = []
self._order_conditions = []
self._offset = None
self._limit = None
self._full_query_mtd_name = None
@property
def count_sql(self):
if self._full_query_mtd_name:
return getattr(self, self._full_query_mtd_name)()["count"]
return f"""
SELECT
Count(*)
FROM
{self._model.table_name}
{self._where_sql}
"""
@property
def full_sql(self):
if self._full_query_mtd_name:
return getattr(self, self._full_query_mtd_name)()["full"]
return f"""
{self._base_sql}
{self._where_sql}
{self._order_by_sql}
{self._offset_sql}
{self._limit_sql}
"""
@property
def _base_sql(self):
return f"""
SELECT
{','.join(field_name for field_name in self._model.fields.keys())}
FROM
{self._model.table_name}
"""
@property
def _where_sql(self):
if self._where_conditions:
statements = [item.get_sql_statement(self._model) for item in self._where_conditions]
print(statements)
statements = [f"({item})" for item in statements if item]
if statements:
return f"""
WHERE
{" AND ".join(statements)}
"""
return ""
@property
def _order_by_sql(self):
if self._order_conditions:
statements = [item.get_sql_statement() for item in self._order_conditions]
statements = [item for item in statements if item]
if statements:
return f"""
ORDER BY
{", ".join(statements)}
"""
return ""
@property
def _offset_sql(self):
if self._offset is not None:
return f"""
OFFSET {self._offset}
"""
return ""
@property
def _limit_sql(self):
if self._limit is not None:
return f"""
LIMIT {self._limit}
"""
return ""
def add_where(self, condition):
self._where_conditions.append(condition)
def add_order(self, condition):
self._order_conditions.append(condition)
def set_offset(self, offset: int):
self._offset = offset
def set_limit(self, limit: int):
self._limit = limit
def set_full_query_mtd_name(self, name: str):
self._full_query_mtd_name = name
manager/query/utils.py
from apps.analytics.models.fields import ModelField
from apps.analytics.models.filter.lookups import FilterFieldLookup
class ModelQueryUtils:
class FilterInput:
_filter_lookup_operator_mapping = {
FilterFieldLookup.Definition.NOT_EQUAL: "",
FilterFieldLookup.Definition.GREATER_THAN_EQUAL_TO: ">=",
FilterFieldLookup.Definition.LESS_THAN_EQUAL_TO: "",
FilterFieldLookup.Definition.LESS_THAN: "
Подробнее здесь: [url]https://stackoverflow.com/questions/79185279/on-every-api-request-list-in-add-where-method-get-appended-it-is-not-resetting[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия