python - django如何使用对数据库作all()的一次查询?
阿神
阿神 2017-04-18 09:19:48
[Python讨论组]

django中如果

querys = (x for x in QuerySet.objects.all())
for query in querys:
    print query

这种情况下对数据库需要做几次查询?如果每次都要查询的话,效率太低了
如果不是一次的话,怎样修改代码使其只对数据库做一次查询就可以讲所有数据放在缓存,然后进行输出

阿神
阿神

闭关修行中......

全部回复(3)
高洛峰

不知道有没有理解对你的需求,可以使用rest_framework的序列化工具,代码如下:

from rest_framework import serializers

#定义一个model
class Personal(models.Model):
    name = models.CharField(verbose_name=u'名称', max_length=20)
    age= models.SmallIntegerField(verbose_name=u'年龄')

#定义序列化
class PersonalSerializer(serializers.ModelSerializer):
    class Meta:
        model = Personal
#使用
serializers = PersonalSerializer(Personal.objects.all(), many=True)
datas = serializers.data #datas就是类似这样的: [{'name': 'aaa', 'age': 1}, {'name': 'bbb', 'age': 2}, ...]
ringa_lee

你这个代码是只执行一次查询的,不过你的代码和下面的代码是一样的,没必要多写一次

for query in QuerySet.objects.all():
    print query

或者

querys = QuerySet.objects.all()
for query in querys:
    print query
巴扎黑

django的query会一些缓存而且只有你做某些操作的时候才会hit数据库

操作包括:切片,取某个值,遍历等

例如:

querys = SomeTings.objects.all() # 此时并不触发数据库
b = querys.filter(filed1=xxx) # 不触发+1

for i in querys:
    print i # 触发
    
for i in querys:
    print i # 不触发,因为上个遍历时以缓存
   
list1 = querys[:2] # 触发
list1 = query2[:2] # 触发,切片并不缓存

object1 = querys[2] # 触发
object1 = querys[2] # 触发,列表取值不缓存
    
c = querys.filter(filed1=xxx) # 不触发,虽然此时querys已经缓存,但是链式查询是一个新的QuerySet对象,并不触发数据
    
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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