【问题标题】:disable ordering by default for django_tables2 Tables默认禁用 django_tables2 表的排序
【发布时间】:2023-03-16 22:30:01
【问题描述】:

我使用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.

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

提前致谢

【问题讨论】:

    标签: django django-orm django-tables2


    【解决方案1】:

    发件人: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 在 cmets 中提到的,将它作为参数传递也应该有效(没有检查):

    table = MyTable(data, orderable=False)
    

    【讨论】:

    • 请注意,它也可用作构造函数的参数,table = MyTable(data, orderable=False) 将禁用表的排序。这优先于class Meta.orderable 属性中设置的任何值。
    【解决方案2】:

    您可以使用__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')
    

    【讨论】:

    • 这可行,但我想避免第二次查询并通过配置 django_tables2.Table 对象(如果可能)来解决它。
    【解决方案3】:

    试着改成这个。

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

    【讨论】:

      猜你喜欢
      • 2022-08-24
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      相关资源
      最近更新 更多