关于Django中使用save更新数据
在使用first() 或者get()得到一个model数据实例后,如果需要修改数据库中对应的这条记录,应该注意先使用一个变量将结果存储下来,然后再进行修改。例如:
mymhrcd = Manhour_rcd.objects.filter(ref_miswo__isnull=True,
ref_acno__contains=mymiswo.airplane.strip(),
ref_task__taskno__contains=mymiswo.taskno.strip(),
work_date__range=(mymiswo.cmp_date - timedelta(days=1),
mymiswo.cmp_date + timedelta(days=2)))
获取mymhrcd这个queryset后,如果需要对第一行记录进行修改,应使用方法1,如果使用方法2则不能实现数据修改:
方法1:
myrtone = mymhrcd.first()
myrtone.ref_miswo_id = mymiswo.id
myrtone.save()
方法2:
mymhrcd.first().ref_miswo_id = mymiswo.id
mymhrcd.first().save()
至于原因,目前还没有仔细分析,后续有时间再查阅资料。今天在coding的过程中遇到了这个情况,感觉是容易被忽略的,特别是还把更新处理写在了try……except结构里没有直接报错,莫名其妙地浪费了不少时间。
当然,更新数据还可以用update方法,而且支持批量操作。但是如果你有一些auto_now=True的字段,而且这些字段对于实际业务有意义的话,最好还是用save()。这两种操作还有很多其他的区别,很多文章都专门做了介绍,感兴趣可以搜一下。