使用django-datatables-view对自定义列进行排序

问题描述

使用Django 3,python 3.6,django-datatable-view 1.19.1 试图用我模型中的列做一个数据表,然后在输出列之前进行计算。 我绘制了我需要的所有值,但是尝试对自定义列进行排序后出现错误

Cannot resolve keyword 'XXXX' into field. Choices are: ...

我找到了一种方法,可以在没有db源的情况下将一列注册为虚拟列,但是它在django-datatable-view 0.5.4文档中,但是这些方法不再起作用。在上一版本中,文档链接找不到我需要的信息。

请帮我弄清楚,如何处理模型字段(排序,渲染)中的自定义计算列

解决方法

这有点棘手。

定义计算字段:

import pyspark.sql.functions as F
from pyspark.sql.dataframe import DataFrame

def transform(self,f):
    return f(self)

DataFrame.transform = transform  
  
df = df.withColumn("array_list2",F.expr("transform(array_list,x -> regexp_replace(x,'','ZZZ'))")) 

这允许您返回计算字段方法的value()。

当我们要对计算字段进行排序时,情况变得复杂。在这种情况下,最好禁用JavaScript中的serverSide操作

-------------|-------------------------------|-------------------------------
ID           |array_list                     | array_list2
---------------------------------------------|-------------------------------
38292786     |[AAA,JLT]                    |[AAA,ZZZ,JLT]                     
38292787     |[DFG]                          |[DFG]                          
38292788     |[SHJ,QKJ,AAA,YTR,CBM]      |[SHJ,CBM]      
38292789     |[DUY,ANK,QJK,POI,CNM,ADD] |[DUY,ADD] 
38292790     |[]                             |[ZZZ]                             
38292791     |[]                             |[ZZZ]   
38292792     |[,HKJ]                      |[ZZZ,HKJ]           

但是,您将不得不立即返回所有行,这可能会杀死服务器。

如果要在后端进行排序,则需要安排并返回带有虚拟字段的适当查询集。

class ListJson(BaseDatatableView):

columns = ["id","status_code","computed_field"]
order_columns = ["id","status_code"]

# Override render_column method
def render_column(self,row,column):
    if column == "computed_field":
        return row.computed_field()
    else:
        return super(ListJson,self).render_column(row,column)

只需像THIS这样构建查询即可。