python - django的通用视图会降低性能吗?
黄舟
黄舟 2017-04-17 17:59:20
[Python讨论组]

一般django的通用视图,就是把一些比较常见的变量的写在一个类里面
然后class IndexView(BaseMixin, ListView): 这样类继承的方式来调用

那么

class BaseMixin(object):
    def get_context_data(self, *args, **kwargs):
        context = super(BaseMixin, self).get_context_data(**kwargs)
        # 热门文章
        context['hot_article_list'] = \
            Article.objects.order_by("-view_times")[0:10]

        # 随机文章10篇
        context['romdon_article_list'] = \
            Article.objects.order_by("?")[0:6]

        # 随机文章倒6篇
        context['dromdon_article_list'] = \
            Article.objects.order_by("?")[:10].reverse()[:6]

        #站长推荐
        context['rank_article_list'] = \
            Article.objects.order_by("-rank")[:6]
        return context

每次在打开一个视图的时候 就会加载这个 我想问下,加载的时候不知道会不会执行查询语句?
如果会的话那真的就是太蛋疼了!
因为我打算把更多的变量都添加到通用视图里面去

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(2)
大家讲道理

全局模板变量这样写吧, 这样不用你的每个view都去继承
settings配置

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                ...
                'website.context_processors.varibble'
            ],
        },
    },
]

然后定义一个context_processors.py文件

def varibble(request):
    content = {
        'hot_article_list': Article.objects.order_by("-view_times")[0:10],
        'romdon_article_list': Article.objects.order_by("?")[0:6]
    }
    return content
天蓬老师

通过查资料,已经解决了,纠正一下回答者的错误.
查看一篇资料,原文是这样的:
Django的queryset对应于数据库的若干记录(row),通过可选的查询来过滤。例如,下面的代码会得到数据库中名字为‘Dave’的所有的人:
person_set = Person.objects.filter(first_name="Dave")

上面的代码并没有运行任何的数据库查询。你可以使用person_set,给它加上一些过滤条件,或者将它传给某个函数,这些操作都不会发送给数据库。这是对的,因为数据库查询是显著影响web应用性能的因素之一。

要真正从数据库获得数据,你需要遍历queryset:

for person in person_set:
    print(person.last_name)

所以可以肯定是,把

    context['romdon_article_list'] = \
        Article.objects.order_by("?")[0:6]

这种查询语句 加在通用视图里面里面并不会影响性能,因为django每次在执行页面的时候,会加载这个信息,但是没有到数据库里面读取,而是当你真正需要遍历的时候,也就是在模板有用到时候,才会调取数据库!

虽然楼上的大哥回答是错误的,但是还是很感谢他热心的回答,为了不让更多人走弯路,所以把答案纠正一下!

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号