如何避免数据库中的重复记录?

有以下型号:


class Parameter (models.Model):

    id_parameter = models.IntegerField(primary_key=True)

    par_rollennr = models.IntegerField(default=0)

    par_definition_id = models.IntegerField(default=0) #not FK

    par_name = models.CharField(max_length=200)



class Measurements (models.Model):

    id_measurement = models.AutoField(primary_key=True)

    par_value = models.IntegerField(default=0)

    line = models.ForeignKey(Line, on_delete=models.CASCADE, null=True)

    order = models.ForeignKey(Order, on_delete=models.CASCADE, null=True)

    recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE, null=True)

    parameter = models.ForeignKey(Parameter, on_delete=models.CASCADE, null=True)

我写下如下: 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, created = Recipe.objects.get_or_create(par_recipe=ws["B2"].value)


line, created = Line.objects.get_or_create(par_machine=ws["C2"].value)


order, created = Order.objects.get_or_create(par_fa=ws["D2"].value)


data = []

data_par = []

_id = 1

for row in ws.iter_rows(row_offset=1):

    parameter = Parameter()

    parameter.id_parameter = _id

    _id += 1

    parameter.par_rollennr = row[5].value

    parameter.par_definition_id = row[6].value

    parameter.par_name = row[7].value

    data_par.append(parameter)


    measurements = Measurements()

    measurements.par_value = row[8].value

    measurements.line = line

    measurements.order = order

    measurements.parameter = parameter

    measurements.recipe = recipe


    data.append(measurements)

# Bulk create data

Measurements.objects.all().delete()

Parameter.objects.all().delete()

Parameter.objects.bulk_create(data_par)

Measurements.objects.bulk_create(data)

return True


扬帆大鱼
浏览 116回答 1
1回答

慕的地8271018

您需要使用比列表更好的数据结构来防止重复。from itertools import zip_longestdef 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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python