功能变化: 批量更新优化
parent
9f523f6eba
commit
cd1b39e9d3
|
@ -139,38 +139,74 @@ class ImportSerializerMixin:
|
|||
ws.add_table(tab)
|
||||
wb.save(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")
|
||||
# 从excel中组织对应的数据结构,然后使用序列化器保存
|
||||
@action(methods=['get'],detail=False)
|
||||
def update_template(self,request):
|
||||
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
|
||||
]
|
||||
data = import_to_data(request.data.get("url"), self.import_field_dict, m2m_fields)
|
||||
unique_list = [
|
||||
ele.name for ele in queryset.model._meta.get_fields() if hasattr(ele, "unique") and ele.unique == True
|
||||
]
|
||||
updateField = request.data.get("updateField")
|
||||
for ele in data:
|
||||
# # 获取 unique 字段
|
||||
# if queryset.model._meta.unique_together: # 判断是否存在联合主键
|
||||
# filter_dic = {i: ele.get(i) for i in list(queryset.model._meta.unique_together[0])}
|
||||
# else:
|
||||
# filter_dic = {i: ele.get(i) for i in list(set(unique_list)) if ele.get(i) is not None}
|
||||
filter_dic = {updateField:ele.get(updateField)}
|
||||
print(162,filter_dic)
|
||||
instance = filter_dic and queryset.filter(**filter_dic).first()
|
||||
if instance and not updateSupport:
|
||||
continue
|
||||
if not filter_dic:
|
||||
instance = None
|
||||
serializer = self.import_serializer_class(instance, data=ele, request=request)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
serializer.save()
|
||||
return DetailResponse(msg=f"导入成功!")
|
||||
assert self.import_field_dict, "'%s' 请配置对应的导入模板字段。" % self.__class__.__name__
|
||||
assert self.import_serializer_class, "'%s' 请配置对应的导入序列化器。" % self.__class__.__name__
|
||||
data = self.import_serializer_class(queryset, many=True, request=request).data
|
||||
# 导出excel 表
|
||||
response = HttpResponse(content_type="application/msexcel")
|
||||
response["Access-Control-Expose-Headers"] = f"Content-Disposition"
|
||||
response["content-disposition"] = f'attachment;filename={quote(str(f"导出{get_verbose_name(queryset)}.xlsx"))}'
|
||||
wb = Workbook()
|
||||
ws = wb.active
|
||||
header_data = ["序号","更新主键(勿改)", *self.import_field_dict.values()]
|
||||
hidden_header = ["#","id", *self.import_field_dict.keys()]
|
||||
df_len_max = [self.get_string_len(ele) for ele in header_data]
|
||||
row = get_column_letter(len(hidden_header) + 1)
|
||||
column = 1
|
||||
ws.append(header_data)
|
||||
for index, results in enumerate(data):
|
||||
results_list = []
|
||||
for h_index, h_item in enumerate(hidden_header):
|
||||
for key, val in results.items():
|
||||
if key == h_item:
|
||||
if val is None or val == "":
|
||||
results_list.append("")
|
||||
else:
|
||||
results_list.append(val)
|
||||
# 计算最大列宽度
|
||||
result_column_width = self.get_string_len(val)
|
||||
if h_index != 0 and result_column_width > df_len_max[h_index]:
|
||||
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:
|
||||
|
|
|
@ -216,7 +216,7 @@ const refreshTken = function () {
|
|||
* @param method
|
||||
* @param filename
|
||||
*/
|
||||
export const downloadFile = function ({ url, params, method, filename }) {
|
||||
export const downloadFile = function ({ url, params, method, filename="文件导出" }) {
|
||||
request({
|
||||
url: url,
|
||||
method: method,
|
||||
|
@ -224,7 +224,7 @@ export const downloadFile = function ({ url, params, method, filename }) {
|
|||
responseType: 'blob'
|
||||
// headers: {Accept: 'application/vnd.openxmlformats-officedocument'}
|
||||
}).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) {
|
||||
const blob = new Blob([res.data], { type: 'charset=utf-8' })
|
||||
const elink = document.createElement('a')
|
||||
|
|
|
@ -164,9 +164,10 @@ export const crudOptions = (vm) => {
|
|||
value: false,
|
||||
component: {
|
||||
placeholder: '请选择是否管理员',
|
||||
show(context){
|
||||
return vm.info.is_superuser?true:false}
|
||||
},
|
||||
show (context) {
|
||||
return !!vm.info.is_superuser
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue