Создать словарь с ключом в качестве атрибута и значением в качестве объекта модели
Допустим, у меня есть такая таблица:
class Blog(models.Model)
title = models.CharField()
body = models.CharField()
author = models.ForeignKey(Author)
Мне нужно создать 3 строки с заголовком (title_1, title_2, title_3). Мне нужно получить все объекты блога и создать словарь с ключом в виде заголовка и значением в виде объекта блога
blog_dict = {'title_1': <blog_object_1>, 'title_2': <blog_object_2>, 'title_2': <blog_object_3>}
Мне нужно обработать 1 миллион записей. Есть ли какой-нибудь эффективный способ сделать это?
это может выполнить эту задачу
blog_dict = {}
blogs = Blog.objects.all()
for blog in blogs:
blog_dict[blog.title] = blog
Если я правильно вас понял, вы хотите создать словарь, который по существу сопоставляет имена каждого объекта блога с его экземпляром, верно? Это действительно зависит от конкретных функций, которые вы используете, и от того, как вы создаете словарь. Я бы создал словарь ПОСЛЕ инициализации каждого объекта, а не после их создания, но это предполагает, что у вас есть доступ к функции init класса и объекты не нужны ни для чего другого до этого момента. Я не совсем понимаю, что вы подразумеваете под "I need to create 3 rows
" в сочетании с "I have 1 million records to work.
", поэтому не могу дать вам точный метод, который можно попробовать. Предположим, что вы хотели разделить 1 миллион записей на таблицу, состоящую из (1mil/3)колонок по 3 строки. Я бы сделал что-то вроде этого:
class Blog(models.Model):
title = models.CharField()
body = models.CharField()
author = models.ForeignKey(Author)
Blogs:'list[Blog]' = [Blog,]*1000000
BlogTable = []
BlogRowBuffer = {}
# Using an int to count instead of len(BlogRowBuffer) to save processing power
BlogRowCount = 0
for blog in Blogs:
BlogRowBuffer[blog.title] = blog
BlogRowCount +=1
#Once you add the third item to the row buffer, the buffer is made into a column in the table.
# And the values reset to start all over.
if BlogRowCount == 3:
BlogTable.append(BlogRowBuffer)
BlogRowBuffer = {}
BlogRowCount = 0
Проблема в том, что независимо от того, как вы решаете эту проблему, вам нужно выполнить итерацию над 1 миллионом объектов, а это всегда займет достаточное количество времени. По возможности следует использовать встроенные функции python, поскольку они написаны на C и, как правило, намного быстрее, чем все остальное. Вам также следует изучить некоторые библиотеки python, которые могут помочь в этом. Я знаю, что deque обеспечивает более высокую скорость, когда дело доходит до pop left/right, но я не знаю ни одной библиотеки, которая могла бы ускорить это.
Кроме того, если вы знаете точное количество объектов, вы можете предварительно выделить место в списке, прежде чем что-то делать, а затем просто изменить список путем индексации, что быстрее, чем добавление: смотрите эту ссылку. Эта ссылка также показывает, что понимание списка может быть быстрее, но я знаю по опыту, что вы всегда должны сравнивать время самостоятельно, так как это зависит от того, КАК вы используете различные методы.