2011-12-26 6 views
3

djangoのGenericForeignKeyを使用し、UserにForeignKeyを持ち、最新の変更日のようないくつかの他のフィールドを持つ投票アプリケーション(django格付けがあれば違いがあります)を使用します。特定のモデルのDjango GenericForeignKeyルックアップ

1人のユーザーが最新の変更日順に投票した、1つのコンテンツタイプのすべてのオブジェクトを取得したいと考えています。私が理解する限り、すべての情報は単一のテーブルにあります(content_typeはプリフェッチ/キャッシュ可能です)。残念ながら、djangoはcontent_objectをリクエストするたびに余分なクエリを作成します。

したがって、特定のモデル、特定のユーザー、関連するオブジェクト、およびデータベースのヒット数が最小の順序で、すべての投票を得るにはどうすればよいですか?

編集:今は2つのクエリを使用しています。最初にすべての投票を選択し、必要なすべてのオブジェクトを取得し、.filter(pk__in = obj_ids)でフィルタリングし、最後に投票オブジェクトに入力します。しかし、​​が問題の解決に役立つようです。

答えて

0

今、私たちはdjango 1.4のprefetch_related()をGenericRelationで使用しています。それでも2つのクエリを使用しますが、非常に直感的なインターフェイスがあります。

0

select_related()をチェックしましたか?それは助けるかもしれません。

外部キー関係に自動的に「追従」し、クエリを実行するときに追加の関連オブジェクトデータを選択するクエリセットを返します。これはパフォーマンスの向上であり、大量のクエリを(時には多くの場合)発生させますが、後で外部キー関係を使用する場合はデータベースクエリを必要としません。

https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related

+0

残念ながらselect_relatedはGFK afaikで動作しません – teferi

0

the models.py of the django-ratings appを見てから、私はあなたがすべてのVoteオブジェクトを取得するにはuser.votes.filter(content_type__model=Model._meta.module_name).order_by("date_changed")(あなたがModelであることによってフィルタリングするモデルを仮定)を行う必要があると思います。関連するオブジェクトについては、クエリセットをループして各アイテムにcontent_objectを取得します。 IMHO、これはDB問合せが最小限に抑えられます。

+0

これは、nがユーザーが投票したオブジェクトの数であるn + 1個のクエリのようです。それは私には良くないようです。 – teferi

関連する問題