かなり小さなDjangoアプリからのデータベース呼び出しを最適化しようとしています。現在、私はいくつかのモデルを持っています、Inquiry
そしてInquiryStatus
。MySQLからすべてのレコードを選択するとJOIN
、2つのテーブルに適切なステートメントが表示され、その後にInquiryStatusテーブルへの多くのリクエストが続きます。すでに行っているのに、Djangoがまだ個別のリクエストを行っているのはなぜselect_related()
ですか?
モデルは次のようになります。
class InquiryStatus(models.Model):
status = models.CharField(max_length=25)
status_short = models.CharField(max_length=5)
class Meta:
ordering = ["-default_status", "status", "status_short"]
class Inquiry(models.Model):
ts = models.DateTimeField(auto_now_add=True)
type = models.CharField(max_length=50)
status = models.ForeignKey(InquiryStatus)
class Meta:
ordering = ["-ts"]
デバッグのために一緒に投げたビューは次のようになります。
def inquiries_list(request, template_name="inquiries/list_inquiries.js"):
## Notice the "print" on the following line. Forces evaluation.
print models.Inquiry.objects.select_related('status').all()
return HttpResponse("CRAPSTICKS")
を変更せずに使ってみましたselect_related(depth=1)
。データベースへの無関係な要求のそれぞれはid
、WHERE
句で特定の1つを選択しています。
アップデート:
したがって、モデルに含める必要のある非常に重要なコードが1つありました。
from fullhistory import register_model
register_model(Inquiry)
register_model(InquiryStatus)
その結果、fullhistory
(私が理解できない理由で)個々の結果を取得して解析しました。