微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Djanjo 唯一约束 - 上传但跳过重复项

如何解决Djanjo 唯一约束 - 上传但跳过重复项

我有一个 django 唯一约束,我使用 django 管理站点导入 .csv 文件。约束按预期工作,但我只想跳过重复项并仍然添加有效记录。有没有办法获得这种行为?

def data_upload(request):
template = "data_upload.html"
data = ScanData.objects.all()
prompt = {
    'order': 'Order of the CSV should be CVE,CVSS,Risk,Host,Hostname,Project_Assigned,Component,Owner,Environment,Location,Notes,Protocol,Port,Name,Synopsis,Description,Solution,Plugin_Output','scandata': data    
          }
if request.method == "GET":
    return render(request,template,prompt)
csv_file = request.FILES['file']
if not csv_file.name.endswith('.csv'):
    messages.error(request,'THIS IS NOT A CSV FILE')
data_set = csv_file.read().decode('UTF-8')
io_string = io.StringIO(data_set)
next(io_string)
for column in csv.reader(io_string,delimiter=','):
    _,created = ScanData.objects.update_or_create(
    CVE=column[0],CVSS=column[1],Risk=column[2],Host=column[3],Hostname=column[4],Project_Assigned=column[5],Component=column[6],Owner=column[7],Environment =column[8],Location=column[9],Notes=column[10],Protocol=column[11],Port=column[12],Name=column[13],Synopsis=column[14],Description=column[15],Solution=column[16],Plugin_Output=column[17],)
  context = {}
  return render(request,context)

解决方法

您可以使用 .bulk_create(…) [Django-doc] 并设置 ignore_conflicts=True 参数。正如文档所说:

在支持它的数据库(除 Oracle 之外的所有数据库)上,将 ignore_conflicts 参数设置为 True 会告诉数据库忽略插入任何未通过约束(例如重复唯一值)的行的失败。启用此参数将禁用在每个模型实例上设置主键(如果数据库通常支持它)。

因此,您列出了模型对象(但尚未保存这些对象),然后使用 .bulk_create(list_of_objects,ignore_conflicts=True)。这看起来像:

m1 = MyModel(field1=value11,field2=value12)
m2 = MyModel(field1=value21,field2=value22)
m3 = MyModel(field1=value31,field2=value32)
MyModel.objects.bulk_create(
    [m1,m2,m3],ignore_conflicts=True
)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。