我正在开发一个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。架构迁移已经完成。
答案 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()
希望有所帮助。