zoukankan      html  css  js  c++  java
  • django orm中filter(条件1).filter(条件2)与filter(条件1,条件2)的区别 哈欠涟涟的日志 网易博客

    django orm中filter(条件1).filter(条件2)与filter(条件1,条件2)的区别 - 哈欠涟涟的日志 - 网易博客

    django orm中filter(条件1).filter(条件2)与filter(条件1,条件2)的区别   

     

    2010-05-28 11:12:25|  分类:
    django
    |  标签: 

    |字号  订阅

    http://docs.djangoproject.com/en/1.2/topics/db/queries/#lookups-that-span-relationships中有两个查询,感觉弄不明白

    Blog.objects.filter(entry__headline__contains='Lennon', entry__pub_date__year=2008)

    Blog.objects.filter(entry__headline__contains='Lennon').filter( entry__pub_date__year=2008)
    从英文文档上看看两者应该是一样的,但网上也有文章说两者之间有时也有区别。
    为了能弄明白这两种表示到底是不是有一样的,最好的方法是能把两种表示的sql语句生成出来,然后再来比较。
    此时 Debug Toolbar就派上用场了。查看http://pypi.python.org/pypi/django-debug-toolbar/0.8.3,可以发现装上这个之后,可以使用debugsqlshell来查看sql语句。
    我把这一个models.py放在myapp中,然后生成相应的sql语句。
    第一个查询语句生成的sql语句为:
    SELECT "myapp_blog"."id",
           "myapp_blog"."name",
           "myapp_blog"."tagline"
    FROM "myapp_blog"
    INNER JOIN "myapp_entry" ON ("myapp_blog"."id" = "myapp_entry"."blog_id")
    WHERE ("myapp_entry"."pub_date" BETWEEN 2008-01-01
           and 2008-12-31 23:59:59.999999
           AND "myapp_entry"."headline" LIKE %Lennon% ESCAPE '\')LIMIT 21
    第二个查询语句生在的sql语句为:
    SELECT "myapp_blog"."id",
           "myapp_blog"."name",
           "myapp_blog"."tagline"
    FROM "myapp_blog"
    INNER JOIN "myapp_entry" ON ("myapp_blog"."id" = "myapp_entry"."blog_id")
    INNER JOIN "myapp_entry" T3 ON ("myapp_blog"."id" = T3."blog_id")
    WHERE ("myapp_entry"."headline" LIKE %Lennon% ESCAPE '\'
           AND T3."pub_date" BETWEEN 2008-01-01
           and 2008-12-31 23:59:59.999999)LIMIT 21
    比较这两个sql语句,发现功能上两者是一样的,但第二个查询语句多了一个INNER JOIN 语句,从性能上讲,应该是第一个查询高效一点。
    这两个查询语句,生成的sql语句有差别,会不会是与django debug toolbar的实现有关,对于此点,我不清楚。
  • 相关阅读:
    第二阶段站立会议03
    第二阶段站立会议02
    第二阶段站立会议01
    第十一周进度条
    小强大扫荡
    测试计划
    用户体验
    各组意见
    第一阶段绩效评估
    站立会议10
  • 原文地址:https://www.cnblogs.com/lexus/p/2506795.html
Copyright © 2011-2022 走看看