如何解决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 举报,一经查实,本站将立刻删除。