我们希望减少一个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进程。
答案 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]