在django ORM中重用现有对象

时间:2014-11-13 09:11:36

标签: python django orm

我们希望减少一个python解释器中相同对象实例的数量。

示例:

class Blog(models.Model):
    author=models.ForeignKey(User)

如果我们迭代了一千个博客,那么相同的(相同的id但不同的python对象)作者对象会被多次创建。

有没有办法让django ORM重用已经创建的用户实例?

示例:

for blog in Blog.objects.all():
    print (blog.author.username)

如果作者" foo-writer"有100个博客,内存中有100个作者对象。这就是我们想要避免的。

我认为像mem-cached / redis这样的解决方案在这里没有帮助,因为我们想要优化python进程。

1 个答案:

答案 0 :(得分:1)

我不确定您在此处是否关注数据库通话或内存使用情况。

如果是前者,那么使用select_related会对您有所帮助:

Blog.objects.all().select_related('author')

将获取所有博客及其相关作者。

如果你想优化内存,那么最好的方法是一次性手动获取相关的作者对象,将它们存储在dict中,然后在每个博客上手动注释该对象:

blogs = Blog.objects.all()
author_ids = set(b.author_id for b in blogs)
authors = Author.objects.in_bulk(list(author_ids))
for blog in blogs:
    blog._author = authors[blog.author_id]