2016-05-10 11 views
2

Djangoでフィードに似たクエリを最適化しようとしています。Djangoクエリーセットから関連オブジェクトを1つだけ取得します

 queryset_comments = Item.objects.distinct() \ 
     .prefetch_related('comments', 'comments__user') \ 
     .filter(comments__user__in=self.request.user.following.all()) \ 
     .prefetch_related(
      Prefetch('comments', queryset=Comment.objects.filter(
       user__in=self.request.user.following.all() 
      ).order_by('-created_on'), to_attr='activity') 
     ) \ 
     .all() 

これは、最初に最も最近のコメントで、私が続くのユーザーによって行われたすべてのコメントのリストと関連activityオブジェクトを提供します。 ...私が試した

 for item in queryset_comments: 
      item.feed_user = item.activity[0].user 
      item.feed_date = item.activity[0].created_on 
      item.feed_activity = 'commented' 

しかし、このループはたったの約500項目に2秒以上を取っている:クエリセットIループ、他のように私は必要な値を設定する今、私は、最初のものを必要としますPrefetchクエリセットに[0]または.first()を追加することによって、(スライスが、両方の方法はDjangoのORMによってサポートされていません。

これは少し速く作るためにどんな提案でプリフェッチ?

+0

「最古」または「最新」を試したことがありますか? – 2ps

+0

'for'ループの直後に' latest_activity = item.activity.first() 'を使い、' latest_activity'オブジェクトを使って 'item'に他の値を設定してみてください。 –

+0

@ 2ps:スライスを使用するときと同じエラーが発生しました: 'AttributeError: 'Item'オブジェクトに '_add_hints'属性がありません – fatz

答えて

0

私はに来て作っsimliar question hereがありました同じ結論。

prefetch_relatedを使用せず、データベースクエリを実行する準備ができるまでクエリセットの作業を終了することをお勧めします。たぶん、ページが分けられているかもしれないので、オブジェクトは20個または50個しかありません。

すべてItem.pkの値のリストを作成し、関連する「アイテムごとに1つのコメント」を(Max('created_on')を使用して)取得します。

prefetch_relatedと同じことですが、もっと制御してください。

関連する問題