功能变化: 批量更新优化
parent
9f523f6eba
commit
cd1b39e9d3
|
@ -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:
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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
|
||||||
},
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue