django-tables2 对自定义列进行排序

问题描述 投票:0回答:1

django-tables2 文档描述了如何对自定义列进行排序(https://django-tables2.readthedocs.io/en/latest/pages/ordering.html#table-order-foo-methods)。但我不知道如何将其应用于我的情况,希望有人能提供帮助。

在共享代码之前,这是我正在做的事情。该表由

django-auditlog LogEntry
实例构建。表中的每一行都是一个
LogEntry
实例。自定义列是已更改的对象的属性(即导致创建此
LogEntry
)。例如,假设学生对象发生更改,自定义列将显示“学生”。

这是我渲染该列的方式。 FWIW,auditlog 的作用是通过 id 和实例的 id 引用内容类型表。我的代码只是遵循该轨迹来获取正确的实例。在实例上有一个方法(

my_category()
)可以生成正确的“主类别”文本。

@staticmethod
    def render_major_category(record):
        try:
            changed_object = ChangeTable.get_changed_object(record)
            answer = changed_object.my_category().capitalize()
        except ObjectDoesNotExist:
            answer = "No data"

        return answer

@staticmethod
    def get_changed_object(record):
        changed_object_type = record.content_type
        try:
            changed_object = changed_object_type.get_object_for_this_type(id=record.object_id)
        except ObjectDoesNotExist:
            raise ObjectDoesNotExist(str(changed_object_type))

        return changed_object

django-tables2 文档说要在方法中注释查询集:

def order(self, queryset, is_descending):
        queryset = queryset.annotate(
            amount=F("shirts") + F("pants")
        ).order_by(("-" if is_descending else "") + "amount")
        return (queryset, True)

我不明白的是如何在

render_major_category
方法中使用我用于
annotate()
的函数。就像
annotate(my_category=something?)
??

我发现的所有内容都是聚合或对属性的直接引用(如上所述)。我发现的解决方案之一建议在类上创建一个属性。但是,我不想为此创建一个特殊的扩展或代理来审计日志 LogEntry。

谢谢。

django-queryset django-tables2
1个回答
0
投票

解决这个问题的一种方法是在将数据交给表之前进行注释。在我看来,

generic.ListView
在这种情况下,查询集的每个元素都会用“带注释”的值进行扩充。

这可能是因为 django naivete,但注释似乎针对聚合或汇总函数,而不是对象引用之类的东西?

© www.soinside.com 2019 - 2024. All rights reserved.