代码之家  ›  专栏  ›  技术社区  ›  Jack M.

Django即使在选择了_related()之后仍在攻击MySQL?

  •  1
  • Jack M.  · 技术社区  · 17 年前

    Inquiry InquiryStatus . 当从MySQL中选择所有记录时,我得到了一个很好的结果 JOIN 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

    因此,有一点非常重要的代码应该放在模型中:

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

    因此 fullhistory 正在(出于我无法理解的原因)提取每个单独的结果并对其进行解析。

    3 回复  |  直到 6 年前
        1
  •  0
  •   Gabriel Ross    17 年前

    我相信这与懒惰的评估有关。Django仅在必要时点击DB,而不是在调用models.Inquiry.objects.select_related('status').all()时

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

        2
  •  0
  •   Daniel Roseman    17 年前

    您所展示的代码实际上根本不应该生成任何查询—QuerySet只在必要时进行计算,而不是在定义它们时进行计算,并且您不在任何地方使用该值,因此不会执行。

        3
  •  0
  •   Jack M.    17 年前

    看来 fullhistory

    看一看 get_all_data

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

    如果有人想写一个详细的原因,为什么会发生这种情况,我会很高兴地标记出正确的答案。

    推荐文章