【问题标题】:How to copy django model object to self如何将django模型对象复制到自己
【发布时间】:2013-11-05 17:53:54
【问题描述】:

我有一个自定义照片/图像服务应用程序。我们的优化之一是图像的数据基于图像数据的 MD5 存储在磁盘上。我编写了一个自定义的save() 方法来处理从File 对象获取数据并创建创建实际数据库对象所需的所有位和部分和字段。

问题在于几乎同时上传同一张图片时发生的竞争情况。 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() 是否有效,或者它是否是处理这种情况的正确方法。

【问题讨论】:

  • 您可以引发自定义异常并让您的应用程序代码处理它(通过请求那里的对象)。

标签: python django copy


【解决方案1】:

我相信deepcopy() 会为此工作。但肯定有比exec() 更好的方法。可能是这样的:

 for field in photo._meta.get_all_field_names:
        setattr(self, field, getattr(photo, field))

【讨论】:

  • deepcopy() 将返回一个然后被分配的对象。我不认为self=deepcopy(photo) 会起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 2019-01-10
  • 1970-01-01
  • 2013-03-13
  • 2016-01-18
相关资源
最近更新 更多