首页 > django如何使用对数据库作all()的一次查询?

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

django中如果

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

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


不知道有没有理解对你的需求,可以使用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}, ...]

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对象,并不触发数据
    

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

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

或者

querys = QuerySet.objects.all()
for query in querys:
    print query
【热门文章】
【热门文章】