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。
谢谢。
解决这个问题的一种方法是在将数据交给表之前进行注释。在我看来,
generic.ListView
在这种情况下,查询集的每个元素都会用“带注释”的值进行扩充。
这可能是因为 django naivete,但注释似乎针对聚合或汇总函数,而不是对象引用之类的东西?