Создать словарь с ключом в качестве атрибута и значением в качестве объекта модели

Допустим, у меня есть такая таблица:

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, но я не знаю ни одной библиотеки, которая могла бы ускорить это.

Кроме того, если вы знаете точное количество объектов, вы можете предварительно выделить место в списке, прежде чем что-то делать, а затем просто изменить список путем индексации, что быстрее, чем добавление: смотрите эту ссылку. Эта ссылка также показывает, что понимание списка может быть быстрее, но я знаю по опыту, что вы всегда должны сравнивать время самостоятельно, так как это зависит от того, КАК вы используете различные методы.

Вернуться на верх