Django bug: Cannot reorder a query once a slice has been taken【2023-02-28】

好好的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

反正都能过

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容