我正在尝试优化来自相当小的Django应用程序的数据库调用。目前我有几个模型Inquiry
和InquiryStatus
。从MySQL中选择所有记录时,我在两个表上得到一个很好的JOIN
语句,然后是对InquiryStatus表的许多请求。如果我已经完成了select_related()
,那么为什么Django仍在提出个别请求?
模型如下:
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
。
因此,有一些非常重要的代码应该放在模型中:
from fullhistory import register_model
register_model(Inquiry)
register_model(InquiryStatus)
结果,fullhistory
(由于我无法理解的原因)拉出每个单独的结果并解析它。
答案 0 :(得分:0)
我认为这与懒惰评估有关。 Django只在必要时才会访问数据库,而不是在调用模型时访问数据库.Inquiry.objects.select_related('status')。all()
答案 1 :(得分:0)
您显示的代码实际上根本不应生成任何查询 - QuerySets仅在必要时进行评估,而不是在定义时进行评估,并且您不在任何地方使用该值,因此不会执行任何操作
请向我们展示一个实际评估qs的模板或其他代码 - 切片,迭代,打印或任何其他内容。
答案 2 :(得分:0)
似乎fullhistory最终序列化了对象,该对象评估实例中的每个字段以给它提供一个比较基础。
查看get_all_data
功能:
http://code.google.com/p/fullhistory/source/browse/trunk/fullhistory/fullhistory.py
如果有人想详细说明为什么会发生这种情况,我很乐意将答案标记为正确。