Python 如何将django模型对象复制到self
我有一个自定义的照片/图像服务应用程序。我们的优化之一是基于映像数据的MD5将映像数据存储在磁盘上。我已经编写了一个自定义的Python 如何将django模型对象复制到self,python,django,copy,Python,Django,Copy,我有一个自定义的照片/图像服务应用程序。我们的优化之一是基于映像数据的MD5将映像数据存储在磁盘上。我已经编写了一个自定义的save()方法来处理从文件对象获取数据并创建创建实际数据库对象所需的所有位、块和字段 有争议的是,几乎同时上载同一图像时发生的竞争条件。两个不同的线程很可能同时调用save()方法 如果第二个线程发现该文件存在,我们将忽略该事实并继续处理。虽然我们在写入之前测试检查文件是否存在,但如果两个进程写入图像数据,则不是错误。这将浪费一些周期,但数据将与md5哈希相同。我们只是测
save()
方法来处理从文件
对象获取数据并创建创建实际数据库对象所需的所有位、块和字段
有争议的是,几乎同时上载同一图像时发生的竞争条件。两个不同的线程很可能同时调用save()
方法
如果第二个线程发现该文件存在,我们将忽略该事实并继续处理。虽然我们在写入之前测试检查文件是否存在,但如果两个进程写入图像数据,则不是错误。这将浪费一些周期,但数据将与md5哈希相同。我们只是测试,以避免浪费这些周期
现在是将实际对象写入数据库的时候了。如果我们成功了,那么一切都很好,我们的对象已经按照django的ORM的需要进行了更新
如果由于完整性错误而失败,这意味着该对象在我们启动时就已经存在
发生这种情况时,我们希望将实际保存的对象的内容复制到self
中,以便调用者有save()
工作的印象
try:
super(Photo,self).save(*args, **kwargs) # the "real" save()
except IntegrityError:
#
# Looks like we were in a race condition. We'll pull the
# record and copy it.
photo = Photo.objects.get(hash=self.hash)
# that fetch darn well should have worked. If it didn't let the
# error propagate so we can find and fix it.
#
# N.B. dangerious copy of fields from db object.
#
for field in photo._meta.get_all_field_names:
exec('self.%s=photo.%s' % (field, field))
所以问题是:这是将django DB对象中的字段复制到另一个DB对象中的最佳方法吗?我不确定copy()
或deepcopy()
是否会起作用,或者这是否是处理这种情况的正确方法。我相信deepcopy()
会起作用。但是肯定有比exec()
更好的方法。也许像这样:
for field in photo._meta.get_all_field_names:
setattr(self, field, getattr(photo, field))
您可以引发一个自定义异常,并让应用程序代码处理它(通过在那里请求对象)。
deepcopy()
将返回一个对象,然后分配该对象。我认为self=deepcopy(照片)行不通。