【django学习-17】数据表操作之查询
作者:互联网
- 常用查询
python manage.py shell
from blog.models import *
查询:
1、全表查询
b = Book.objects.all()
#查询第一条
b[0].title
>>> b = Book.objects.all()
>>> b[0].title
'python'
2、查询前2条数据
>>> b = Book.objects.all()[:2]
>>> print(b)
<QuerySet [<Book: python>, <Book: java>]>
3、查询某个字段
#values方法,数据以列表返回,列表元素以字典表示
>>> b = Book.objects.values("title")
>>> print(b[1]["title"])
java
values_list方法,数据以列表返回,列表元素以字典表示
>>> b = Book.objects.values_list("title")[:3]
>>> b
<QuerySet [('python',), ('java',), ('linux',)]>
4、使用get方法查询数据
>>> b = Book.objects.get(id=1)
>>> b
<Book: python>
>>> b.price
Decimal('99.00')
5、使用filter方法查询数据
>>> b = Book.objects.filter(id=2)
>>> b
<QuerySet [<Book: java>]>
6、and查询
>>> b = Book.objects.filter(id=2,publisher=2)
>>> b
<QuerySet [<Book: java>]>
#filter的查询条件可设置为字段
>>> d = dict(id=2,publisher=2)
>>> b = Book.objects.filter(**d)
>>> b
<QuerySet [<Book: java>]>
7、or查询
#需要引入Q,编码格式:Q(field=value)|Q(field=value)
>>> from django.db.models import Q
>>> b = Book.objects.filter(Q(id=1)|Q(title='Django'))
>>> b
<QuerySet [<Book: python>, <Book: Django>]>
8、不等于查询,在Q前面使用"~"即可
>>> b = Book.objects.filter(~Q(id=1)|Q(title='Django'))
>>> b
<QuerySet [<Book: java>, <Book: linux>, <Book: Django>]>
9、country方法统计查询数据的数据量
>>> b = Book.objects.filter(~Q(id=1)|Q(title='Django')).count()
>>> b
3
10、去重查询,distinct
>>> b = Book.objects.values("publisher_id").filter(publisher_id=1).distinct()
>>> b
<QuerySet [{'publisher_id': 1}]>
11、排序,order_by默认升序,降序只需要在字段前面加"-"即可
>>> b = Book.objects.order_by('id')
>>> b
<QuerySet [<Book: python>, <Book: java>, <Book: linux>, <Book: Django>]>
>>> b = Book.objects.order_by('-id')
>>> b
<QuerySet [<Book: Django>, <Book: linux>, <Book: java>, <Book: python>]>
#还支持多字段排序
>>> b = Book.objects.order_by('publisher_id','-id')
>>> b
<QuerySet [<Book: linux>, <Book: python>, <Book: java>, <Book: Django>]>
12、聚合查询aggregate(*args,**kwargs)
#通过对QuerySet进行计算,返回一个聚合值的字典。aggregate()中每一个参数都指定一个包含在字典中的返回值。即在查询集上生成聚合
#比如,你想要计算所有在售书的平均价钱
>>> from django.db.models import Avg,Min,Sum,Max
>>> b = Book.objects.aggregate(average_price=Avg('price'))
>>> b
{'average_price': Decimal('132.500000')}
#如果你也想知道所有图书价格的最大值和最小值,可以这样查询:
>>> Book.objects.aggregate(Avg('price'), Max('price'), Min('price'))
{'price__avg': Decimal('132.500000'), 'price__max': Decimal('200.00'), 'price__min': Decimal('99.00')}
#aggregate()子句的参数描述了我们想要计算的聚合值,在这个例子中,是Book模型中price字段的平均值
#aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值的
标识符,值是计算出来的聚合值。
13、分组查询annotate(*args,**kwargs)
#可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合。
#查询publisher_id为1,出的书的总价格
>>> b = Book.objects.filter(publisher_id=1).values("price")
>>> b
<QuerySet [{'price': Decimal('99.00')}, {'price': Decimal('111.00')}]>
>>> b = Book.objects.filter(publisher_id=1).aggregate(Sum("price"))
>>> b
{'price__sum': Decimal('210.00')}
#查询各个作者出的书的总价格,这里就涉及到分组了,分组条件是authors__name
>>> b = Book.objects.values("publisher_id").annotate(Sum("price"))
>>> b
<QuerySet [{'publisher_id': 1, 'price__sum': Decimal('210.00')}, {'publisher_id': 2, 'price__sum': Decimal('120.00')}, {'publisher_id': 3, 'price__sum': Decimal('200.00')}]>
- 上述例子讲述了常用的数据查询方法,但有时我们需要使用不同的查询条件来满足多方面的查询需求,上述的查询条件get和filter只能使用等值的方法来匹配数据,若想使用大于、不等于或者模糊查询的匹配方法,则可使用匹配符实现,说明如下:
标签:17,objects,price,查询,filter,数据表,Book,django,id 来源: https://www.cnblogs.com/xwltest/p/16701668.html