1

我正在尝试优化来自一个相当小的 Django 应用程序的数据库调用。目前我有几个模型,InquiryInquiryStatus. 从 MySQL 中选择所有记录时,我JOIN在两个表上得到了一个很好的语句,然后是对 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),没有任何变化。对数据库的每个无关请求都idWHERE子句中选择一个特定的请求。

更新:

所以有一点非常重要的代码应该与模型一起放入:

from fullhistory import register_model
register_model(Inquiry)
register_model(InquiryStatus)

结果,fullhistory是(由于我无法理解的原因)提取每个单独的结果并对其进行解析。

4

3 回答 3

0

我相信这与惰性评估有关。Django 仅在必要时访问数据库,而不是在您调用 models.Inquiry.objects.select_related('status').all() 时

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

于 2009-08-28T00:20:01.437 回答
0

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

请向我们展示一个模板或其他一些实际评估 qs 的代码 - 对其进行切片、迭代、打印或任何操作。

于 2009-08-28T06:36:26.277 回答
0

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

看一下get_all_data函数:

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

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

于 2009-08-28T14:43:58.343 回答