1 回答

TA贡献1796条经验 获得超4个赞
您需要使用比列表更好的数据结构来防止重复。
from itertools import zip_longest
def handle_parameters_upload(request, file):
wb = openpyxl.load_workbook(file, read_only=True)
first_sheet = wb.get_sheet_names()[0]
ws = wb.get_sheet_by_name(first_sheet)
recipe, _ = Recipe.objects.get_or_create(par_recipe=ws["B2"].value)
line, _ = Line.objects.get_or_create(par_machine=ws["C2"].value)
order, _ = Order.objects.get_or_create(par_fa=ws["D2"].value)
# Clear existing data
Measurements.objects.all().delete()
Parameter.objects.all().delete()
parameter_data = set()
duplicate_measurement_parameter = {}
measurement_data = []
for row in ws.iter_rows(row_offset=1):
parameter = (row[5].value, row[6].value, row[7].value,)
if parameter in parameter_data:
duplicate_measurement_parameter[row[8].value] = {
'par_rollennr': parameter[0],
'par_definition_id': parameter[1],
'par_name': parameter[2],
}
# Add the parameter
parameter_data.add(parameter)
# par_rollennr, par_definition_id, par_name, measurement: par_value
measurement_data.append(row[8].value)
# Bulk create data
parameters = Parameter.objects.bulk_create([
Parameter(
id_parameter=index,
par_rollennr=p_data[0],
par_definition_id=p_data[1],
par_name=p_data[2],
) for index, p_data in enumerate(parameter_data)
])
Measurements.objects.bulk_create([
Measurements(
line=line,
order=order,
recipe=recipe,
par_value=m_data,
parameter=parameter or Parameter.objects.filter(**duplicate_measurement_parameter.get(m_data, {})).first(),
)
for parameter, m_data in zip_longest(parameters, measurement_data)
])
return True
添加回答
举报