2017-12-09 19 views
0

私はこの質問をしました。注文は投稿の最後のコメントで記録を投稿します。このクエリは小さなテーブルでうまく動作します。しかし、私は約2Mの行をランダムなデータでデータベースに埋めました。 Explainされたクエリーを、Post表で順次スキャンが実行されることを説明しています。DjangoのORMを使用してサブテーブルに参加するには?

Post.objects.extra(select={'last_update': 'select max(c.create_date) from comment_comment c where c.post_id = post_post.id'}).order_by('-last_update') 

私は現在のクエリよりも速い同じクエリを書き換えました。しかし、私はdjangoのormに照会する方法を見つけることができませんでした。どのように私はそれを書き換えることができますか?可能であれば、できるだけ生のクエリを使用しないで記述したいと思います。

よろしくお願いいたします。助けてくれてありがとう。ジャンゴで

posts.objects 
    .annotate(last_update=Max('comments__create_date')) 
    .order_by('-last_update')[:50] 

annotateはあなたの友達です:私はあなたのDjangoモデルに関するいくつかの仮定を行う場合

select 
p.*, 
t.last_update 
from 
post_post p 
join 
(select c.post_id as pid, max(c.create_date) as last_update from comment_comment c group by pid) t 
on p.id = t.pid 
order by t.last_update desc 
limit 50; 

答えて

0

することは、それは次のようになります。

関連する問題