1

order_itemこれは、最新のタイムスタンプで注文する現在のクエリです。

order_items.annotate(newest_note_time=Max('ordernotes__timestamp')).
    order_by('newest_note_time')

できます。ただし、それを表示すると、debug-toolbar2つの残忍なクエリが表示されますが、それらはすべてほぼ同じです. 私はやってみました:

order_items = order_items.order_by('-ordernotes__timestamp')

しかし、その結果、重複した結果が得られる不適切なクエリが発生します。

ここで生の SQL にジャンプせずにこのクエリを実行するより良い方法はありますか?

これがクエリの1つです(2番目は基本的に同じですが、2番目を生成する理由はわかりません...)

SELECT ••• FROM `order_orderitem`
INNER JOIN `order_orderitemstatus` ON (`order_orderitem`.`status_id` = `order_orderitemstatus`.`id`)
INNER JOIN `order_order` ON (`order_orderitem`.`order_id` = `order_order`.`id`)
INNER JOIN `title_title` ON (`order_orderitem`.`title_id` = `title_title`.`id`)
INNER JOIN `home_service` ON (`order_orderitem`.`service_id` = `home_service`.`id`)
LEFT OUTER JOIN `order_ordernotes` ON (`order_orderitem`.`id` = `order_ordernotes`.`order_item_id`)
WHERE NOT (`order_orderitemstatus`.`name` IN ('Complete', 'Live', 'Archived'))
GROUP BY
  `order_orderitem`.`id`, `order_orderitem`.`order_id`, `order_orderitem`.`title_id`, `order_orderitem`.`service_id`,
  `order_orderitem`.`metadata_locale_id`, `order_orderitem`.`purchase_order`, `order_orderitem`.`due_date`, `order_orderitem`.`feature`,
  `order_orderitem`.`trailer`, `order_orderitem`.`artwork`, `order_orderitem`.`chaptering`, `order_orderitem`.`cc`,
  `order_orderitem`.`metadata`, `order_orderitem`.`subtitles`, `order_orderitem`.`forced_narrative`, `order_orderitem`.`qc_note`,
  `order_orderitem`.`audio`, `order_orderitem`.`dub_card`, `order_orderitem`.`live_url`, `order_orderitem`.`metadata_valid`,
  `order_orderitem`.`status_id`, `order_orderitem`.`date_created`, `order_order`.`id`, `order_order`.`number`, `order_order`.`provider_id`,
  `order_order`.`date_created`, `order_order`.`date_ordered`, `order_order`.`is_archived`, `title_title`.`id`, `title_title`.`film_id`,
  `title_title`.`name`, `title_title`.`provider_id`, `title_title`.`original_locale_id`, `title_title`.`country_of_origin_id`,
  `title_title`.`synopsis`, `title_title`.`production_company`, `title_title`.`copyright`, `title_title`.`run_time`,
  `title_title`.`original_theatrical_release`, `title_title`.`color`, `title_title`.`film_type`, `title_title`.`no_cc_reason`,
  `title_title`.`includes_hd`, `title_title`.`provider_identifier`, `title_title`.`episode_production_number`, `title_title`.`container_position`,
  `title_title`.`season_id`, `home_service`.`id`, `home_service`.`name`, `home_service`.`notes`, `order_orderitemstatus`.`id`,
  `order_orderitemstatus`.`name`, `order_orderitemstatus`.`department_id`, `order_orderitemstatus`.`is_finished`,
  `order_orderitemstatus`.`ordering` ORDER BY NULL
4

1 に答える 1

0
.select_related(depth=1)

それを元のクエリの最後に追加して、魔法が起こるかどうかを確認してください。

私が持っているひどいクエリの別の可能な修正は、ページをキャッシュすることです。ファイルの先頭に次を追加します。

from django.views.decorators.cache import cache_page

そして、あなたの定義のすぐ上に...追加:

@cache_page(60 * 5)

これは 60 秒 * 5 で、5 分間です。時間を適切なものに変更します。

于 2013-03-29T06:41:52.160 に答える