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によってサポートされていません。
これは少し速く作るためにどんな提案でプリフェッチ?
「最古」または「最新」を試したことがありますか? – 2ps
'for'ループの直後に' latest_activity = item.activity.first() 'を使い、' latest_activity'オブジェクトを使って 'item'に他の値を設定してみてください。 –
@ 2ps:スライスを使用するときと同じエラーが発生しました: 'AttributeError: 'Item'オブジェクトに '_add_hints'属性がありません – fatz