ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【django学习-17】数据表操作之查询

2022-09-16 23:30:26  阅读:309  来源: 互联网

标签:17 objects price 查询 filter 数据表 Book django id


  • 常用查询
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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有