Django - 当主键已经存在时,使用 excel 文件更新数据库会导致错误
Django - updating database with an excel file is causing an error when primary key already exists
我的模型中的注释 contact_email 是我的联系人模型的主键
我有一个 html 页面和表单,用户可以在其中上传 excel 文件以将他们的联系人上传到数据库。如果 contact_email 以前没有上传过,一切正常,联系人被上传。
但是,如果 contact_email 已经存在,则会引发错误并且联系人的信息不会更新,例如,如果在新的 excel 文件中现有联系人的 fav_sport 已更改,它将不更新了。
给出的错误是 /upload/ 处的 IntegrityError
重复键值违反唯一约束 "contacts_contact_pkey"
详细信息:密钥 (contact_email)=(john@gmail.com) 已经存在。
这是导致错误的代码:
for index, row in df.iterrows():
created = Contact.objects.update_or_create(
contact_name = row[0],
fav_sport = row[1],
contact_email = row[2],
)
如何修改此代码以解决此错误?
The defaults
is a dictionary of (field, value) pairs used to update
the object.
试试这个,如果有效请告诉我:
for index, row in df.iterrows():
defaults = {
"contact_name": row[0],
"fav_sport": row[1],
"contact_email": row[2],
}
obj, created = Contact.objects.update_or_create(**defaults, defaults=defaults)
您正在使用 update_or_create 中的所有字段进行唯一性查询,就像在文档
中一样
(假设您想按 contact_email 更新)
for index, row in df.iterrows():
created = Contact.objects.update_or_create(
contact_email= row[2],
defaults = {
"contact_name": row[0],
"fav_sport": row[1]
}
)
我的模型中的注释 contact_email 是我的联系人模型的主键
我有一个 html 页面和表单,用户可以在其中上传 excel 文件以将他们的联系人上传到数据库。如果 contact_email 以前没有上传过,一切正常,联系人被上传。
但是,如果 contact_email 已经存在,则会引发错误并且联系人的信息不会更新,例如,如果在新的 excel 文件中现有联系人的 fav_sport 已更改,它将不更新了。
给出的错误是 /upload/ 处的 IntegrityError 重复键值违反唯一约束 "contacts_contact_pkey" 详细信息:密钥 (contact_email)=(john@gmail.com) 已经存在。
这是导致错误的代码:
for index, row in df.iterrows():
created = Contact.objects.update_or_create(
contact_name = row[0],
fav_sport = row[1],
contact_email = row[2],
)
如何修改此代码以解决此错误?
The
defaults
is a dictionary of (field, value) pairs used to update the object.
试试这个,如果有效请告诉我:
for index, row in df.iterrows():
defaults = {
"contact_name": row[0],
"fav_sport": row[1],
"contact_email": row[2],
}
obj, created = Contact.objects.update_or_create(**defaults, defaults=defaults)
您正在使用 update_or_create 中的所有字段进行唯一性查询,就像在文档
中一样(假设您想按 contact_email 更新)
for index, row in df.iterrows():
created = Contact.objects.update_or_create(
contact_email= row[2],
defaults = {
"contact_name": row[0],
"fav_sport": row[1]
}
)