为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

扬帆大鱼 2021-09-11 17:38:43
有以下型号: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 = 1for 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 dataMeasurements.objects.all().delete()Parameter.objects.all().delete()Parameter.objects.bulk_create(data_par)Measurements.objects.bulk_create(data)return True
查看完整描述

1 回答

?
慕的地8271018

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



查看完整回答
反对 回复 2021-09-11
  • 1 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号