针对大量对象优化South数据迁移

时间:2014-03-19 19:13:29

标签: django django-south data-migration

我正在开发一个django项目,我需要一个反向的OneToOne关系。以前,OneToOneField中的photo MediaFile指向模型Photo。我希望将其替换为从OneToOneField指向mediafileobject的新Photo MediaFile。 (原因是照片模型将来会变得不重要,而且我们需要Photo管理员内的MediaFile模型的内联管理员。)

当我运行数据迁移以将旧关系复制到新关系时,一分钟后出现

socket.error: [Errno 24] Too many open files

唯一可信的原因是我操作太多物体(大约20000)。如果只有几百个对象受到影响,则不会出现错误。这是我写的迁移代码:

def forwards(self, orm):
    mediafiles = MediaFile.objects.all()
    for mediafile in mediafiles:
        try:
            mediafile.photo.mediafileobject = mediafile
        except AttributeError:
            pass # When mediafile.photo is None
        else:
            mediafile.photo.save()

如何优化此功能?我正在使用django1.3,South0.7.3和MySQL。架构迁移已经完成。

1 个答案:

答案 0 :(得分:1)

您可以使用django的Paginator将查询集拆分为页面/块:

paginator = Paginator(MediaFile.objects.all(), 10)
for i in xrange(1, paginator.num_pages):
    for mediafile in paginator.page(i).object_list:
        try:
            mediafile.photo.mediafileobject = mediafile
        except AttributeError:
            pass # When mediafile.photo is None
        else:
            mediafile.photo.save()

希望有所帮助。