好好的code发生了bug:
rows = Test.objects.filter(~Q(active=0))
for param in params:
value = request_data.get(param)
if param == 'time_start':
rows = rows.filter(event_date__gte=value)
elif param == 'time_end':
rows = rows.filter(event_date__lte=value)
elif param == 'recent_items':
rows = rows.order_by('-num')[0: int(value)] # NOTICE!! if code goes here, then it will trigger error at last line
else:
temp_query_dict = {
param: value # param+'__icontains': value
}
rows = rows.filter(**temp_query_dict)
logger.info("Order data record by num desc.")
rows = rows.order_by('-num') # requester want to order data by id columns
error 信息: AssertionError: Cannot reorder a query once a slice has been taken.
查了一下,是切片后无法重新排序的意思。
关于如何判断是否被切片,在querySet对象(也就是rows
)中找到了一个,rows.query.high_mark
。如果没有被排序过,它是None,否则是相应的数字。另外这里头还有一个rows.query.low_mark
,不过其初始值为0.
所以code 可以简单地修改为:
if rows.query.high_mark is None:
logger.info("Order data record by num desc.")
rows = rows.order_by('-num') # requester want to order data by id columns
另外,我这里可以讨个巧,因为我是order完了再切片,所以在最后我可以去判断一下之前是否order过,如果是就不再order了。
if not rows.ordered:
logger.info("Order data record by num desc.")
rows = rows.order_by('-num') # requester want to order data by id columns
反正都能过