2011-01-05 16 views
3

私はdjangoで次のモデル構造を持っています。単一クエリのManyToManyフィールドを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フィールドはdjangoのselect_related()のようなフェッチ操作に影響しないので、カテゴリやタグとともに既存の記事を読み込むのに役立つ方法はありますか?

答えて

0

あなたはDjangoのORMを経由して、このテーブルを照会し、その上でselect_relatedを使用することができますArticleTag例えば多対多の関係にintermediary tableを追加する場合:

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

あなたは結果かけて繰り返すことができ私はタグに関連付けられている特定の記事があるかどうかをチェック...私はdjangoに他の方法はありませんthroughモデルを指定せずに直接関​​係を表すテーブルを照会する、ない場合は、未処理のSQLクエリを使用してそれでもクエリできます。あなたが本当に多くのデータを持っているなら、これは多分ラムの使用量を生み出すかもしれませんが、データベースに一度だけヒットするでしょう!

関連する問題