Повторное использование существующих объектов в django ORM

Мы хотим уменьшить количество экземпляров одного объекта в одном интерпретаторе python.

Пример:

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

Если мы перечислим тысячи блогов, то один и тот же (тот же идентификатор, но другой объект python) создаются несколько раз.

Есть ли способ сделать повторное использование ORJ django уже созданными экземплярами пользователя?

Пример:

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

Если у автора "foo-writer" есть 100 блогов, в памяти есть 100 авторских объектов. Этого мы хотим избежать.

Я думаю, что такие решения, как mem-cache/redis, здесь не помогут, так как мы хотим оптимизировать процесс python.

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]

licensed under cc by-sa 3.0 with attribution.