def __init__(self, query_set=None, serializer_class=None, # noqa
query_params=None, static_filter=None, static_exclude=None,
static_order=None):
"""Initialise view instance."""
if not isinstance(query_params, QueryParams):
raise TypeError("%s not an instance of QueryParams" % query_params)
if not isinstance(query_set, QuerySet):
raise TypeError("%s not an instance of QuerySet" % query_set)
if not issubclass(serializer_class, serializers.BaseSerializer):
raise TypeError("%s not a subclass of BaseSerializer"
% serializer_class)
query = query_params.query
if not query:
self._response = Response(status=status.HTTP_400_BAD_REQUEST)
else:
base = query_set
records_total = base.count()
filter_value = query['search']['value']
filter_query = Q()
exclude_query = Q()
if static_filter:
filter_query |= static_filter
elif filter_value:
filter_cols = []
for col_index in query['columns']:
if query['columns'][col_index]['searchable']:
filter_cols.append(query['columns'][col_index]['name'])
for col in filter_cols:
filter_query |= Q(**{"%s__icontains" % col: filter_value})
if static_exclude:
exclude_query |= static_exclude
filtered = base.filter(filter_query).exclude(exclude_query)
records_filtered = filtered.count()
order_by_columns = list()
if static_order:
order_by_columns.append(static_order)
else:
for i in query['order']:
col_index = query['order'][i]['column']
col_name = query['columns'][col_index]['name']
if query['order'][i]['dir']:
order_by_columns.append("-%s" % col_name)
else:
order_by_columns.append(col_name)
ordered = filtered.order_by(*order_by_columns)
page_start = query['start']
page_end = page_start + query['length']
page = ordered[page_start:page_end]
serializer = serializer_class(
page, many=True, context={'request': query_params.request})
data = serializer.data
response = {
'draw': query['draw'],
'recordsTotal': records_total,
'recordsFiltered': records_filtered,
'data': data,
}
self._response = Response(response)
评论列表
文章目录