我的程序从CSV (customover, item, total)加载数据,下面是我的数据模型:
from django.db import models
class Member(models.Model):
customer = models.CharField(max_length=50)
item = models.JSONField(max_length=50)
total = models.IntegerField()
def __str__(self):
return self.customer
我的观点:
def upload(request):
template = 'upload.html'
promt = {
'member': 'Member of CSV should be customer, item, total'
}
if request.method == 'GET':
return render(request, template, promt)
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 = Member.objects.update_or_create(
customer=column[0],
item=column[1],
total=column[2]
)
context = {}
return render(request, template, context)
一般来说,下载工作,但不是更新用户数据,而是创建了一个具有相同客户的新对象,我如何使它不创建新客户,而只更新total和item ?
CSV数据示例:
customer,item,total
bellwether,Cavorit,6126
resplendent,Saphire,8502
bellwether,Ruby,342
没有创建两个或多个具有领头羊客户的对象,而是只有一个具有领头羊客户的对象一个项目("Kavorit", "Ruby"), total(6468)。谢谢你的宝贵时间
这里的问题是,当你传递所有3个字段和django查找数据库时,如果有一个查询同时匹配所有3个字段,显然如果其中一个是不同的,那么现有的一个,它不匹配并创建一个新的。文档显示docs
update_or_create方法试图从数据库中获取一个对象基于给定的kwargs。如果找到匹配项,则更新字段传入默认字典。
那么试试这个:
_, created = Member.objects.update_or_create(
customer=column[0]
defaults={ "item":column[1], "total":column[2] }
)