python - django如何使用对数据库作all()的一次查询?

 martinsleibert_471 发布于 2022-10-28 10:40

django中如果

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

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

3 个回答
  • 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对象,并不触发数据
        
    
    2022-11-12 01:45 回答
  • 你这个代码是只执行一次查询的,不过你的代码和下面的代码是一样的,没必要多写一次

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

    或者

    querys = QuerySet.objects.all()
    for query in querys:
        print query
    2022-11-12 01:45 回答
  • 不知道有没有理解对你的需求,可以使用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}, ...]
    2022-11-12 01:45 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有