django文件上传,只上传一张

并发条件下对于一个对象的不同图片进行操作,导致只有一张生效

class PersonalId(models.Model):
    imageface = models.ImageField(null=True, blank=True, upload_to='personalid/%Y/%m/%d/')
    imageback = models.ImageField(null=True, blank=True, upload_to='personalid/%Y/%m/%d/')

对于PersonalId对象上传 face和back照片时候,如果是同步请求,不会出现任何问题
但是并发请求的生活会导致只有一张进行上传

原因:根据django的model.save()机制,如果是update操作,会将里面的值全部重新set,并非只对应某个字段进行更新。
故当并发获取对象的时候,2个对象其实都获取相同的数据,但是当其中一个对象更新了,另外一个对象的数据并未更新
而在另外一个对象更新的时候,会将原始数据也重新覆盖。

解决方法:制定save的字段,只对某个字段更新。model.save(update_fileds=['imageface'])
** 留意 ** 当对于文件对象进行删除的时候,也是对于全数据段更新 model.imageface.delete() 故如果有相关并发操作,不建议直接使用此函数,
可通过os.remove进行删除

def remove_files(path):
    """
    删除存在系统中的文件
    :param path: list or str
    :return:
    """
    if isinstance(path, (str, unicode)):
        path = [path]
    elif isinstance(path, list):
        pass
    else:
        raise ValueError("传入参数错误")
    for item in path:
        try:
            os.remove(item)
        except OSError:
            continue
posted @ 2017-12-04 11:15  紫金龙骑  阅读(138)  评论(0编辑  收藏  举报
UV PV