django_tables2表默认禁用排序

时间:2017-11-17 14:45:59

标签: django django-orm django-tables2

我使用django_tables2来渲染我的表格。对于一个表,我只想查看最近的5个条目。因此,我需要在将查询集传递给表对象之前对其进行排序:

qset = myObject.objects.order_by('-start_time').all()[:5]
table = MyTableClass(qset, template='path/to/template.html')

这会产生以下错误消息:

AssertionError: Cannot reorder a query once a slice has been taken.

我可以为每个orderable=False设置django_tables.Column,但由于MyTableClass继承自另一个表类,我想避免这种情况。

提前致谢

3 个答案:

答案 0 :(得分:4)

来自:http://django-tables2.readthedocs.io/en/latest/pages/api-reference.html#table-meta

  

orderable(bool):列的可订购属性的默认值。

     

如果表和列未指定值,则列的可订购值将回退到此值。这提供了一种简单的机制来禁用整个表的排序,而不向表中的每一列添加orderable = False。

所以这解决了我的问题:

class MyTableClass(django_tables2.Table):
    class Meta:
        orderable = False
    ...

<强>更新 正如@Jieter在评论中提到的,将其作为论据传递也应该有效(没有检查):

table = MyTable(data, orderable=False)

答案 1 :(得分:1)

您可以使用__in选择最近的条目:

most_recent = list(myObject.objects.order_by('-start_time').all()[:5].values_list('pk', flat=True))  # list is required if databases does not support LIMIT in subqueries
qset = myObject.objects.filter(id__in=most_recent).order_by('-start_time')

答案 2 :(得分:-3)

尝试更改为此。

qset = myObject.objects.all().order_by('-start_time')[:5]