Усталый от использования этого регулярного выражения при замене запроса, использовал этот подход.Просто установите фильтры с опцией или «ORM» или «RAW».Если он необработанный, он создаст запрос 'where'.Вы также можете добавить в него другие фильтры.
# For ORM
GET_SETTLEMENT_PARAM_QUERY_FORMATTING = {
"settlement_no": {"query_text": "settlement_no__in", "list": True},
"start_date": {"query_text": "start_date__gte", "list": False},
"end_date": {"query_text": "end_date__lte", "list": False}
}
# For RAW query
BAGSETTLEMENT_DOWNLOAD_PARAM_QUERY_FORMATTING_RAW = {
"start_date": {"query_text": "created_on >= '{}'", "list": True, "ignore_format": True},
"end_date": {"query_text": "created_on <= '{}'", "list": True, "ignore_format": True},
"store_id": {"query_text": "store_id IN {}", "list": True},
"brand_id": {"query_text": "brand_id IN {}", "list": True},
"company_id": {"query_text": "company_id = {}", "list": False},
"bag_id": {"query_text": "bag_id = {}", "list": False},
"awb_number": {"query_text": "awb_number = {}", "list": False},
"settlement_no": {"query_text": "settlement_no IN {}", "list": True},
"settled": {"query_text": "settled = {}", "list": False}
}
@query_params(formatting=GET_BAGSETTLEMENT_PARAM_QUERY_FORMATTING, query_type='ORM')
def get(self, request):
filters = parse_url_params(params=self.request.query_params, formatting=BAGSETTLEMENT_DOWNLOAD_PARAM_QUERY_FORMATTING_RAW, query_type='RAW')
try:
link = get_download_link(filters=filters,
store_ids=request.store_ids,
end_file_name=settlement_no)
return Response({"link": link})
except Exception as e:
logger.critical('Bag Settlement Download Link Generation Failed')
return Response({'link': None, 'error': 'Error while fetching data'})
def query_params(formatting, query_type):
def assign_query_params(f):
@wraps(f)
def decorated_function(req, *args, **kwargs):
try:
request = req.request
except AttributeError:
request = req
# print(request.store_ids)
data = dict(request.GET)
if data.get('store_id'):
data['store_id'] = list(set(data.get('store_id')).intersection(set(request.store_ids)))
else:
data['store_id'] = request.store_ids
request.filters = parse_url_params(params=data,
formatting=formatting,
query_type=query_type)
return f(req, *args, **kwargs)
return decorated_function
return assign_query_params
def parse_url_params(params, formatting, query_type):
"""
:param params: dictionary
:param formatting: Formatting Dictionary
:param query_type: ORM else RAW
:return: filters
"""
# print(params)
filters = dict() if query_type == "ORM" else ''
for key, value in formatting.items():
param_value = params.get(key)
if not param_value:
continue
query_text = value['query_text']
if query_type == "ORM":
query_value = param_value[0] if not value['list'] else param_value
filters[query_text] = query_value
else:
if not value['list']:
query_value = param_value[0]
else:
if value.get('ignore_format'):
query_value = param_value
else:
z = str(param_value)
query_value = z.replace(z[0], '(').replace(z[len(z)-1], ')')
syntax = query_text.format(query_value)
filters += syntax if not len(filters) else ' AND '+syntax
return filters
С его помощью вы можете получить как фильтры ORM, так и фильтры запросов RAW.Проблема, с которой я столкнулся, заключалась в том, что дата и время не вставлялись в виде строки, поэтому здесь я просто создал строку всех условий условия.
Вам нужно будет ввести запрос вручную и сохранить его в базе данных или вконстанта, подобная этой -
select * from table where {filters};
Вы также можете добавить в нее порядок, но вам нужно было бы явно передать его в запрос, не добавляя его в фильтры, так что это так -
select * from table where {filters} order by {order_by}
Если вам нужно добавить еще один явный фильтр, вы можете сделать это следующим образом
select * from table where {filters} and store_id in {store_id};