查询
all()方法
用法:MyModel.objects.all()
作用:查询MyModel实体中的所有数据
等同与 " select * from table "
返回值:QuerySet容器对象,内部存放MyMdeol实例(数组)
例:
from bookstore.models inport Book
books = Book.objects.all()
for book in books:
print('书名:',book.title)
可以在模型类中定义一个__str__方法,自定义QuerySet中输出格式,例:
def __str__(self):
return '%s_%s_%s_%s'%
(self.title,self.price,self.pub,self.market_price)
values()方法
用法:MyModel.objects.values(字段名)
作用:查询部分列的数据并返回
等同于 select 字段 from xxx
返回值:QuerySet(内部存放字典)
例:
from bookstore.models inport Book
books = Book.objects.all()
for book in books:
print('书名:',book['title'])
values_list()方法
用法:MyModel.objects.values_list(字段名)
作用:返回元组形式的查询结果
等同于 select 字段 from xxx
返回值:QuerySet(内部存放元组)
例:
from bookstore.models inport Book
books = Book.objects.all()
for book in books:
print('书名:',book[0])
order_by()方法
用法:MyModel.objects.order_by(字段名)
默认是升序排序,若要降序,则在字段名前加一个 '-'
【对于QuerySet值,可以用query()方法查看数据查询语句】
条件查询
filter(条件)
语法:MyModel.objects.filter(属性=值...)
作用:返回包含此条件下的数据
返回值:QuerySet类型
例:类名.objects.filter(属性=值)
exclude(条件)
语法:MyModel.objects.exclude(条件)
作用:返回不包含此条件的数据
返回值:QuerySet类型
例:类名.objects.filter(属性=值)
get(条件)
语法:MyModel.objects.get(条件)
作用:返回满足条件的唯一数据(如果结果有多条数据,就会抛错;结果没有数据也会报错)
返回值:不属于QuerySet类型
例:类名.objects.filter(属性=值)
查询谓词
定义:为了更灵活的条件查询
说明:每一个查询谓词都有独立的查询功能
1. __exact:等值匹配
字段__exact=值
例:Author.objects.filter(id__exact=1)
等同于 select * from author where id = 1
2. __contains:包含指定值
字段__contains=值
例:Author.objects.filter(name__contains='w')
等同于 select * from author where name like '%w%'
相似的还有:
__startswith:以xxx开始
等同于 select * from author where name like 'w%'
__endswith:以xxx结束
等同于 select * from author where name like '%w'
3. __gt:大于指定值
字段__contains=值
例:Author.objects.filter(age__gt=50)
等同于 select * from author where age > 50
相似的还有:
__gte:大于等于
__lt:小于
__lte:小于等于
4. __in:查找数据在指定范围内
字段__in=[范围]
例:Author.objects.filter(country__in=['中国','日本','韩国'])
等同于 select * from author where country in ('中国','日本','韩国')
5. __range:查找数据在指定区间范围内
字段__range=(区间)
例:Author.objects.filter(age__range=(35,50))
等同于 select * from author where age between 35 to 50
改写数据(单个数据)
先查询到数据,在进行改写
1. 变量 = 类.objects.get(id=值).字段 = 值
2. 变量.save()
改写数据(批量数据)
先获得QuerySet数据,在update(属性=值)
1. 变量 = 类.objects.filter(属性=值)
2. 变量.update(字段=更新值)
删除数据(单个数据)
1.先查找数据
2.使用delete()方法实现删除
例:
try:
auth = Author.objects.get(id = 1)
suth.delete()
except:
print('出错')
删除数据(批量数据)
1.查找满足条件的QuerySet集合对象
2.使用delete()方法实现删除
例:
auths = Author.objects.filter(age_gt = 65)
auths.delete()
伪删除[并没有真正删除]
在表中添加一个布尔类型的字段(is_active),默认是True,执行删除时,把数据改为False
在查询数据时,添加is_active=True进行过滤
F对象
一个F对象代表数据库中某条记录的字段信息
作用:-通常是对数据库中的字段值在不获取的情况下操作
-用于类属性字间的比较
【便于对一列数据同一操作 (例:所有价格上涨10元) 】
语法:
from django.db.models import F
F('列名')
例:
Book.objects.all().update(market_price=F('market_price')+10
sql语句:
'UPDATE `bookstore_book` SET `market_price` = (`bookstore_book`.`market_price` + 10)
资源竞争问题:
topic = Topic.objects.get(id=topic.id)
new_like = topic.like + 1
topic.like = new_like
topic.save()
注意:还可以解决资源竞争问题(避免请求过多)
topic.like = F('like') + 1
topic.save()
sql语句:
update topic set like = like +1 where id = xxx
Q对象
专门解决逻辑 或, 逻辑 非 等操作
运算符:
& 与操作
| 或操作
~ 非操作
语法:
条件1或条件2成立 Q(1)|Q(2)
条件1和条件2同时成立 Q(1)&Q(2)
条件1成立且条件2不成立 Q(1)&~Q(2)
例:
from django.db.models import Q
Book.objects.filter(Q(price__lt=20)|Q(pub='xxx'))