功能变化: 批量更新优化

pull/84/head
猿小天 2022-12-30 22:07:43 +08:00
parent 9f523f6eba
commit cd1b39e9d3
3 changed files with 72 additions and 35 deletions

View File

@ -139,38 +139,74 @@ class ImportSerializerMixin:
ws.add_table(tab) ws.add_table(tab)
wb.save(response) wb.save(response)
return response return response
else:
# 从excel中组织对应的数据结构然后使用序列化器保存
queryset = self.filter_queryset(self.get_queryset())
# 获取多对多字段
m2m_fields = [
ele.name
for ele in queryset.model._meta.get_fields()
if hasattr(ele, "many_to_many") and ele.many_to_many == True
]
import_field_dict = {'id':'更新主键(勿改)',**self.import_field_dict}
data = import_to_data(request.data.get("url"), import_field_dict, m2m_fields)
for ele in data:
filter_dic = {'id':ele.get('id')}
instance = filter_dic and queryset.filter(**filter_dic).first()
print(instance)
serializer = self.import_serializer_class(instance, data=ele, request=request)
serializer.is_valid(raise_exception=True)
serializer.save()
return DetailResponse(msg=f"导入成功!")
updateSupport = request.data.get("updateSupport") @action(methods=['get'],detail=False)
# 从excel中组织对应的数据结构然后使用序列化器保存 def update_template(self,request):
queryset = self.filter_queryset(self.get_queryset()) queryset = self.filter_queryset(self.get_queryset())
# 获取多对多字段 assert self.import_field_dict, "'%s' 请配置对应的导入模板字段。" % self.__class__.__name__
m2m_fields = [ assert self.import_serializer_class, "'%s' 请配置对应的导入序列化器。" % self.__class__.__name__
ele.name data = self.import_serializer_class(queryset, many=True, request=request).data
for ele in queryset.model._meta.get_fields() # 导出excel 表
if hasattr(ele, "many_to_many") and ele.many_to_many == True response = HttpResponse(content_type="application/msexcel")
] response["Access-Control-Expose-Headers"] = f"Content-Disposition"
data = import_to_data(request.data.get("url"), self.import_field_dict, m2m_fields) response["content-disposition"] = f'attachment;filename={quote(str(f"导出{get_verbose_name(queryset)}.xlsx"))}'
unique_list = [ wb = Workbook()
ele.name for ele in queryset.model._meta.get_fields() if hasattr(ele, "unique") and ele.unique == True ws = wb.active
] header_data = ["序号","更新主键(勿改)", *self.import_field_dict.values()]
updateField = request.data.get("updateField") hidden_header = ["#","id", *self.import_field_dict.keys()]
for ele in data: df_len_max = [self.get_string_len(ele) for ele in header_data]
# # 获取 unique 字段 row = get_column_letter(len(hidden_header) + 1)
# if queryset.model._meta.unique_together: # 判断是否存在联合主键 column = 1
# filter_dic = {i: ele.get(i) for i in list(queryset.model._meta.unique_together[0])} ws.append(header_data)
# else: for index, results in enumerate(data):
# filter_dic = {i: ele.get(i) for i in list(set(unique_list)) if ele.get(i) is not None} results_list = []
filter_dic = {updateField:ele.get(updateField)} for h_index, h_item in enumerate(hidden_header):
print(162,filter_dic) for key, val in results.items():
instance = filter_dic and queryset.filter(**filter_dic).first() if key == h_item:
if instance and not updateSupport: if val is None or val == "":
continue results_list.append("")
if not filter_dic: else:
instance = None results_list.append(val)
serializer = self.import_serializer_class(instance, data=ele, request=request) # 计算最大列宽度
serializer.is_valid(raise_exception=True) result_column_width = self.get_string_len(val)
serializer.save() if h_index != 0 and result_column_width > df_len_max[h_index]:
return DetailResponse(msg=f"导入成功!") df_len_max[h_index] = result_column_width
ws.append([index+1,*results_list])
column += 1
#  更新列宽
for index, width in enumerate(df_len_max):
ws.column_dimensions[get_column_letter(index + 1)].width = width
tab = Table(displayName="Table", ref=f"A1:{row}{column}") # 名称管理器
style = TableStyleInfo(
name="TableStyleLight11",
showFirstColumn=True,
showLastColumn=True,
showRowStripes=True,
showColumnStripes=True,
)
tab.tableStyleInfo = style
ws.add_table(tab)
wb.save(response)
return response
class ExportSerializerMixin: class ExportSerializerMixin:

View File

@ -216,7 +216,7 @@ const refreshTken = function () {
* @param method * @param method
* @param filename * @param filename
*/ */
export const downloadFile = function ({ url, params, method, filename }) { export const downloadFile = function ({ url, params, method, filename="文件导出" }) {
request({ request({
url: url, url: url,
method: method, method: method,
@ -224,7 +224,7 @@ export const downloadFile = function ({ url, params, method, filename }) {
responseType: 'blob' responseType: 'blob'
// headers: {Accept: 'application/vnd.openxmlformats-officedocument'} // headers: {Accept: 'application/vnd.openxmlformats-officedocument'}
}).then(res => { }).then(res => {
const fileName = window.decodeURI(filename + '.xls' || res.headers['content-disposition'].split('=')[1]) || '文件导出.xls' const fileName = window.decodeURI(filename + '.xlsx' || res.headers['content-disposition'].split('=')[1]) || '文件导出.xlsx'
if (res) { if (res) {
const blob = new Blob([res.data], { type: 'charset=utf-8' }) const blob = new Blob([res.data], { type: 'charset=utf-8' })
const elink = document.createElement('a') const elink = document.createElement('a')

View File

@ -164,9 +164,10 @@ export const crudOptions = (vm) => {
value: false, value: false,
component: { component: {
placeholder: '请选择是否管理员', placeholder: '请选择是否管理员',
show(context){ show (context) {
return vm.info.is_superuser?true:false} return !!vm.info.is_superuser
}, }
}
} }
}, },
{ {