Django 优化大量对象的南方数据迁移

Django 优化大量对象的南方数据迁移,django,django-south,data-migration,Django,Django South,Data Migration,我正在做一个django项目,我需要一个反向的OneToOne关系。以前,在MediaFile中有指向模型photo的OneToOneField。我想用新的OneToOneFieldmediafileobject替换它,它从Photo指向MediaFile。(原因是照片模型在未来将变得不重要,我们希望在MediaFileadmin中为photo模型提供一个内联管理员。) 当我运行数据迁移将旧关系复制到新关系时,一分钟后出现 socket.error: [Errno 24] Too many op

我正在做一个django项目,我需要一个反向的OneToOne关系。以前,在
MediaFile
中有指向模型
photo
OneToOneField
。我想用新的
OneToOneField
mediafileobject
替换它,它从
Photo
指向
MediaFile
。(原因是照片模型在未来将变得不重要,我们希望在
MediaFile
admin中为
photo
模型提供一个内联管理员。)

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

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。架构迁移已经完成。

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

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()

希望这会有帮助。

您的代码没有直接解决我的问题,而是生成了一条不同的错误消息,帮助我找到错误的来源:Photo类的save方法中的内容。通过使用
update()
绕过
save()
,最终解决了问题。