Python论坛  - 讨论区

标题:[python-chinese] 关于Django的延迟加载

2007年09月19日 星期三 02:18

jeff jie bbmyth在gmail.com
星期三 九月 19 02:18:24 HKT 2007

Django×ÜÊÇLazyLoadµÄ¡£¼ÇµÃDjangoµÄÎĵµÕâÑù½²¡£
ÏÖÔÚÓÐÕâÑùµÄÒ»¸öÇé¾°¡£ÎÒÒªÏÔʾһ¸öÆÀÂÛÁÐ±í£¬²¢ÇÒÐèÒªÆÀÂÛËùÊôµÄÎÄÕÂID×÷Ϊһ¸ö²ÎÊý¡£¿´´úÂ룺

ÔÚViewÀïÃ棬recent_comments = Comment.objects.filter
(blog=blog).order_by('-comment_time')[:10]
ÔÚTemplate£º
{% for comment in recent_comments %}
    
  • {{comment.title}} ({{comment.author_name}})
  • {% endfor%} ÎÒ¸öÈËÈÏΪ£¬comment.comment_to.id Õâ¸ö±í´ïʽ²»»áÈ¥ÔٴβéѯÊý¾Ý¿â£¬ÎÒÕâÀïÖ»ÐèÒªÓõ½CommentËùÊôµÄEntryµÄID¡£ÔÚJavaµÄÒ»¸öORM¿ò¼Ü£¬HibernateÀÈç¹ûʹÓÃÁËLazyLoad£¬ ÄÇôֻÊÇÒýÓÃʵÌåµÄIDÊDz»»á´¥·¢ÔٴβéѯÊý¾Ý¿âµÄ£¬JavaʹÓö¯Ì¬´úÀí¼¼ÊõʵÏÖÕâµã£¬ÄÇôPythonʵÏÖÆðÀ´Ó¦¸ÃÔÙ¼òµ¥¡£ µ«ÊÇÎÒÏë´íÁË£¬ÎÒʹÓÃһЩSql¸ú×ÙµÄÖмä¼þ·¢ÏÖ£¬ÏÔʾÿһÌõCommentʱ¶¼»áÈ¥¸ù¾ÝComment_to_idÈ¥²éѯһ´ÎEntryµÄ±í¡£µäÐ͵Ä1+NÏÖÏó¡£Õâ¾ÍºÜ¸ãЦ£¬Ã¿Ò»´Î²éѯ³öÀ´µÄÊý¾ÝÀïÃ棬ֻÓÐIDÊÇÎÒÏëÒªµÄ£¬¶øIDÕýºÃÊÇDjangoÓÃÀ´²éѯµÄÌõ¼þ£¬ÄǾÍÏ൱ÓÚûÊÂÕÒʸÉÁË¡£ ºóÀ´ÎÒÖ»ºÃ¼ÓÉÏselect_relatedÀ´½â¾öÕâ¸öÎÊÌ⣬²»¹ýÓÃSelect_relatedÀ´½â¾öÕâ¸öÎÊÌâÎÒ¸öÈË¿´À´ÓеãÀË·Ñ×ÊÔ´¡£Django»¹²»ÈçÖÇÄܵ㣬¼ì²âÒ»ÏÂÈç¹ûÊÇIDµÄ»°£¬¸ù±¾²»ÐèÒªÔÙÅܵ½Êý¾Ý¿â²é¶àÒ»±é¡£ ÏàП÷λҲÓÐÀàËƵÄÐèÇ󣬽â¾ö·½·¨ÊÇʲôÄØ£¿ÓÐʲô¸üºÃµÄ½¨ÒéÂ𣿠¸ü¶àµÄÌÖÂÛºÍÔ­ÎÄÔÚÕâÀï <http://www.fallever.com/blog/jeff/16/>£º -- site:http://www.fallever.com -------------- 下一部分 -------------- Ò»¸öHTML¸½¼þ±»ÒƳý... URL: http://python.cn/pipermail/python-chinese/attachments/20070919/69071b14/attachment.htm

    [导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

    2007年09月19日 星期三 04:12

    John fractal johnfractal在gmail.com
    星期三 九月 19 04:12:33 HKT 2007

    ooohhh,Django的ORM没有这么智能拉,不过你这种情况可以用comment.comment_to_id就可以了, :)
    
    在07-9-19,jeff jie <bbmyth在gmail.com> 写道:
    >
    > Django总是LazyLoad的。记得Django的文档这样讲。
    > 现在有这样的一个情景。我要显示一个评论列表,并且需要评论所属的文章ID作为一个参数。看代码:
    >
    > 在View里面,recent_comments = Comment.objects.filter
    > (blog=blog).order_by('-comment_time')[:10]
    > 在Template:
    > {% for comment in recent_comments %}
    >     
  • > comment.id}}"> > > {{comment.title}} > > ({{comment.author_name}}) > {% endfor%} > 我个人认为,comment.comment_to.id > 这个表达式不会去再次查询数据库,我这里只需要用到Comment所属的Entry的ID。在Java的一个ORM框架,Hibernate里,如果使用了LazyLoad, > 那么只是引用实体的ID是不会触发再次查询数据库的,Java使用动态代理技术实现这点,那么Python实现起来应该再简单。 > 但是我想错了,我使用一些Sql跟踪的中间件发现,显示每一条Comment时都会去根据Comment_to_id去查询一次Entry的表。典型的1+N现象。这就很搞笑,每一次查询出来的数据里面,只有ID是我想要的,而ID正好是Django用来查询的条件,那就相当于没事找事干了。 > > > 后来我只好加上select_related来解决这个问题,不过用Select_related来解决这个问题我个人看来有点浪费资源。Django还不如智能点,检测一下如果是ID的话,根本不需要再跑到数据库查多一遍。 > 相信各位也有类似的需求,解决方法是什么呢?有什么更好的建议吗? > 更多的讨论和原文在这里 <http://www.fallever.com/blog/jeff/16/>: > -- > site:http://www.fallever.com > _______________________________________________ > python-chinese > Post: send python-chinese在lists.python.cn > Subscribe: send subscribe to python-chinese-request在lists.python.cn > Unsubscribe: send unsubscribe to python-chinese-request在lists.python.cn > Detail Info: http://python.cn/mailman/listinfo/python-chinese > -------------- 下一部分 -------------- 一个HTML附件被移除... URL: http://python.cn/pipermail/python-chinese/attachments/20070919/db29d94c/attachment.html

    [导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

    2007年09月19日 星期三 07:54

    limodou limodou在gmail.com
    星期三 九月 19 07:54:44 HKT 2007

    On 9/19/07, John fractal <johnfractal在gmail.com> wrote:
    > ooohhh,Django的ORM没有这么智能拉,不过你这种情况可以用comment.comment_to_id就可以了, :)
    >
    > 在07-9-19,jeff jie <bbmyth在gmail.com> 写道:
    > >
    > > Django总是LazyLoad的。记得Django的文档这样讲。
    > > 现在有这样的一个情景。我要显示一个评论列表,并且需要评论所属的文章ID作为一个参数。看代码:
    > >
    > > 在View里面,recent_comments =
    > Comment.objects.filter(blog=blog).order_by('-comment_time')[:10]
    > > 在Template:
    > > {% for comment in recent_comments %}
    > >     
  • > href="/blog/{{blog.shortcut}}/{{comment.comment_to.id}}/#{{comment.id}}"> > > > > {{comment.title}} > > > > ({{comment.author_name}}) > > {% endfor%} > > > 我个人认为,comment.comment_to.id这个表达式不会去再次查询数据库,我这里只需要用到Comment所属的Entry的ID。在Java的一个ORM框架,Hibernate里,如果使用了LazyLoad, > > > 那么只是引用实体的ID是不会触发再次查询数据库的,Java使用动态代理技术实现这点,那么Python实现起来应该再简单。 > > > 但是我想错了,我使用一些Sql跟踪的中间件发现,显示每一条Comment时都会去根据Comment_to_id去查询一次Entry的表。典型的1+N现象。这就很搞笑,每一次查询出来的数据里面,只有ID是我想要的,而ID正好是Django用来查询的条件,那就相当于没事找事干了。 > > > 后来我只好加上select_related来解决这个问题,不过用Select_related来解决这个问题我个人看来有点浪费资源。Django还不如智能点,检测一下如果是ID的话,根本不需要再跑到数据库查多一遍。 目前django好象做不到,建议你提交一个ticket给django。如果你要限定select的字段可以使用values方法,不过得到的就是一个字典,而不是一个数据库记录的对象了。 -- I like python! UliPad <>: http://code.google.com/p/ulipad/ My Blog: http://www.donews.net/limodou

    [导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

    2007年09月19日 星期三 11:46

    haur hekun06在gmail.com
    星期三 九月 19 11:46:59 HKT 2007

    ¹ØÁ¬²éѯ£¬¾ÍÓÃSQLÀ´Ð´¡£¡£¡£¡£ ´Ó×ÖµäÀï´¦ÀíϾÍÐÐÁË
    -------------- 下一部分 --------------
    Ò»¸öHTML¸½¼þ±»ÒƳý...
    URL: http://python.cn/pipermail/python-chinese/attachments/20070919/c6f8cd56/attachment.html 
    

    [导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

    2007年09月19日 星期三 12:05

    jeff jie bbmyth在gmail.com
    星期三 九月 19 12:05:00 HKT 2007

    Èç¹ûÒòΪÕâô¼òµ¥µÄÐèÒª¶¯ÊÖÖ±½ÓдSql¸Ð¾õÓеã¹ýÁË¡£ORMÒ»±ßЪ×ÅÈ¥ÁË¡£
    ¿´¿´£¬¹âÊÇÒªÓùØÁª¶ÔÏóµÄID£¬ÀíÏëºÍ×ÔÈ»µÄÇé¿ö϶¼Ó¦¸Ã²»ÐèÒªÖظ´¼ÓÔØ°¡¡£
    
    ÔÚ07-9-19£¬haur <hekun06在gmail.com> дµÀ£º
    >
    > ¹ØÁ¬²éѯ£¬¾ÍÓÃSQLÀ´Ð´¡£¡£¡£¡£ ´Ó×ÖµäÀï´¦ÀíϾÍÐÐÁË
    >
    > _______________________________________________
    > python-chinese
    > Post: send python-chinese在lists.python.cn
    > Subscribe: send subscribe to python-chinese-request在lists.python.cn
    > Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
    > Detail Info: http://python.cn/mailman/listinfo/python-chinese
    >
    
    
    
    -- 
    site:http://www.fallever.com
    -------------- 下一部分 --------------
    Ò»¸öHTML¸½¼þ±»ÒƳý...
    URL: http://python.cn/pipermail/python-chinese/attachments/20070919/d82f3893/attachment.htm 
    

    [导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

    2007年09月19日 星期三 13:39

    风向标 vaneoooo在gmail.com
    星期三 九月 19 13:39:26 HKT 2007

    ÄÇÈç¹ûʹÓÃÁË»º´æÄØ£¿
    
    Æð³õÎÒÒ²ÒÔΪÔÚÄ£°æÖÐʹÓÃobject.id²»»áÔÙÒý·¢²éѯÁË¡£ -   - !!
    -------------- 下一部分 --------------
    Ò»¸öHTML¸½¼þ±»ÒƳý...
    URL: http://python.cn/pipermail/python-chinese/attachments/20070919/9281f887/attachment-0001.html 
    

    [导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

    2007年09月19日 星期三 13:48

    @@ askfor在gmail.com
    星期三 九月 19 13:48:13 HKT 2007

    john fractal˵µÄ°ì·¨²»ÊÇͦºÃÂð¡£
    
    On 9/19/07, ·çÏò±ê <vaneoooo在gmail.com> wrote:
    >
    > ÄÇÈç¹ûʹÓÃÁË»º´æÄØ£¿
    >
    > Æð³õÎÒÒ²ÒÔΪÔÚÄ£°æÖÐʹÓÃobject.id²»»áÔÙÒý·¢²éѯÁË¡£ -   - !!
    >
    > _______________________________________________
    > python-chinese
    > Post: send python-chinese在lists.python.cn
    > Subscribe: send subscribe to python-chinese-request在lists.python.cn
    > Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
    > Detail Info: http://python.cn/mailman/listinfo/python-chinese
    >
    -------------- 下一部分 --------------
    Ò»¸öHTML¸½¼þ±»ÒƳý...
    URL: http://python.cn/pipermail/python-chinese/attachments/20070919/7aa76c84/attachment.htm 
    

    [导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

    2007年09月19日 星期三 14:22

    jeff jie bbmyth在gmail.com
    星期三 九月 19 14:22:39 HKT 2007

    ÔçÉÏÊÔÁËJohn fractal˵µÄ°ì·¨¡£Ð§¹û¸úobject.idÊÇÒ»ÑùµÄ¡£
    ÔÚ07-9-19£¬@@ <askfor在gmail.com> дµÀ£º
    >
    > john fractal˵µÄ°ì·¨²»ÊÇͦºÃÂð¡£
    >
    > On 9/19/07, ·çÏò±ê <vaneoooo在gmail.com> wrote:
    > >
    > > ÄÇÈç¹ûʹÓÃÁË»º´æÄØ£¿
    > >
    > > Æð³õÎÒÒ²ÒÔΪÔÚÄ£°æÖÐʹÓÃobject.id²»»áÔÙÒý·¢²éѯÁË¡£ -   - !!
    > >
    > > _______________________________________________
    > > python-chinese
    > > Post: send python-chinese在lists.python.cn
    > > Subscribe: send subscribe to python-chinese-request在lists.python.cn
    > > Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
    > > Detail Info: http://python.cn/mailman/listinfo/python-chinese
    > >
    >
    >
    > _______________________________________________
    > python-chinese
    > Post: send python-chinese在lists.python.cn
    > Subscribe: send subscribe to python-chinese-request在lists.python.cn
    > Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
    > Detail Info: http://python.cn/mailman/listinfo/python-chinese
    >
    
    
    
    -- 
    site:http://www.fallever.com
    -------------- 下一部分 --------------
    Ò»¸öHTML¸½¼þ±»ÒƳý...
    URL: http://python.cn/pipermail/python-chinese/attachments/20070919/cad15448/attachment.htm 
    

    [导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

    如下红色区域有误,请重新填写。

      你的回复:

      请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

      Zeuux © 2025

      京ICP备05028076号