即使在select_related()之后Django也会遇到MySQL?

时间:2009-08-27 22:10:02

标签: python django django-models django-select-related

我正在尝试优化来自相当小的Django应用程序的数据库调用。目前我有几个模型InquiryInquiryStatus。从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(由于我无法理解的原因)拉出每个单独的结果并解析它。

3 个答案:

答案 0 :(得分:0)

我认为这与懒惰评估有关。 Django只在必要时才会访问数据库,而不是在调用模型时访问数据库.Inquiry.objects.select_related('status')。all()

http://docs.djangoproject.com/en/dev/topics/db/queries/#id3

答案 1 :(得分:0)

您显示的代码实际上根本不应生成任何查询 - QuerySets仅在必要时进行评估,而不是在定义时进行评估,并且您不在任何地方使用该值,因此不会执行任何操作

请向我们展示一个实际评估qs的模板或其他代码 - 切片,迭代,打印或任何其他内容。

答案 2 :(得分:0)

似乎fullhistory最终序列化了对象,该对象评估实例中的每个字段以给它提供一个比较基础。

查看get_all_data功能:

http://code.google.com/p/fullhistory/source/browse/trunk/fullhistory/fullhistory.py

如果有人想详细说明为什么会发生这种情况,我很乐意将答案标记为正确。