问题描述
使用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这样构建查询即可。