Оптимизированный способ получения полей ManyToMany в модели django в одном запросе - PullRequest
3 голосов
/ 05 января 2011

У меня есть следующая структура модели в django.

Category:
    - name
    - description

Tag:
    - name

Article:
    - guid
    - title
    - detail
    - tags (Many2Many with Tag)
    - cats (Many2Many with Category)

Теперь в моей работе по обновлению статьи (до 100 000) я должен выполнить следующие действия.

- for each article:
     - to check if this article has already appeared in another category
         - if yes, associate article with current category
         - if no, create article along current category
     - to check if any of associated tags are exists or not,
          - if not exists create tag, and associate with current article
          - if exists, just associated with current article

Во время выполненияэта операция у меня уже есть словарь существующих статей, которые были получены из базы данных.

Поскольку поля ManyToMany не влияют на операции выборки, такие как select_related () в django, есть ли другой способ, который может помочь мне в загрузке существующих статей вместе с категориями и тегами?

1 Ответ

0 голосов
/ 05 января 2011

Если вы добавите промежуточную таблицу к отношениям "многие ко многим", например, ArticleTag, вы можете запросить эту таблицу с помощью ORM в django и использовать select_related для нее:

# Get all 'tag-relations' WITH associated articles AND tags
articles_tags = ArticleTag.objects.all().select_related()

Вы могли бы затем выполнить итерации по результату, чтобы проверить, связана ли конкретная статья, которую я связал с тегом ... Я думаю, в django нет другого способа запросить таблицу, которая представляет отношение напрямую, без указания through -моделив противном случае вы все равно можете запросить его с помощью необработанного SQL-запроса.Если у вас действительно много данных, это может привести к большому объему оперативной памяти, но, тем не менее, вы попадете в базу данных только один раз!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...