Django在ORM机制下的数据库增删改查
==============================================
1.增:
方法1
b.ook = BookInfo(field=value)
book.save()
方法2
BookInfo.objects.create(field=value)
2.删:
BookInfo.objects.get().delete()
3.改:
方法1
book.name=value
book.save()
方法2
BookInfo.objects.get().update(name=value)
4.查
- get()查询单个数据
注意:使用get查询,如果数据不存在会报异常DoseNotExist
book = BookInfo.objects.get(id=1)
- all()查询全部
books = BookInfo.objects.all()
- first()第一个 & last()最后一个
book = BookInfo.objects.first()
book = BookInfo.objects.last()
- count()个数
BookInfo.objects.all().count()
- 过滤查询filter()
filter()过滤出多个结果
exclude()排除符合条件剩下的结果(取反)
get()获取单个结果
三种方法的语法形式一样
语法形式:filter(字段名__运算符 = 值)
查询编号为1的图书
BookInfo.objects.get(id=1)
BookInfo.objects.get(pk=1) # primary key
- exact 表示判断相等
BookInfo.objects.get(id__exact=1)
简写为
BookInfo.objects.get(id=1)
BookInfo.objects.get(name='射雕英雄传')
- filter 和 get 比较
BookInfo.objects.get(id=1) # 单个结果 <BookInfo: 射雕英雄传>
BookInfo.objects.filter(id=1) # 返回结果集 <QuerySet [<BookInfo: 射雕英雄传>]>
- 字段__contains:模糊查询
BookInfo.objects.filter(name__contains="湖")
BookInfo.objects.filter(name__contains="英雄")
- 字段__endswith & 字段__startswith:开头&结尾匹配查询
BookInfo.objects.filter(name__startswith="传")
BookInfo.objects.filter(name__endswith='部')
- 字段__isnull:为空查询
BookInfo.objects.filter(name__isnull=True)
- 字段__in:指定内容查询
# 查询编号1,3,5的书籍
BookInfo.objects.filter(id__in=[1, 3, 5])
- 大于 :字段__gt
- 大于等于: 字段__gte
- 小于: 字段__lt
- 小于等于: 字段__lte
BookInfo.objects.filter(id__gt=3)
BookInfo.objects.filter(id__gte=3)
BookInfo.objects.filter(id__lt=2)
BookInfo.objects.filter(id__lte=2)
- 时间查询
年:日期字段 __year
月:日期字段__month
日:日期字段__day
周:日期字段__weekday
# 查询1980年发布的图书
BookInfo.objects.filter(pub_date__year=1980)
# 查询5月发布的图书
BookInfo.objects.filter(pub_date__month=5)
# 查询11号发布的图书
BookInfo.objects.filter(pub_date__day=11)
# 查询1990年1月1号后发表的图书
BookInfo.objects.filter(pub_date__gt='1990-1-1')
- F对象
F对象可以实现两个属性的比较
语法格式:filter(字段名__运算符=F(‘字段名’))
from django.db.models import F
# 查询评论量大于阅读量的书籍
BookInfo.objects.filter(commentcount__gt=F('readcount'))
# 评论量 大于阅读量2倍的书籍
BookInfo.objects.filter(commentcount__gt=F("readcount") * 2)
- Q对象
Q对象的语法形式:Q(字段名__ 运算符=值)
or :Q(字段名__ 运算符=值) | Q(字段名__ 运算符=值)
and :Q(字段名__ 运算符=值) & Q(字段名__ 运算符=值)
not :~Q(字段名__ 运算符=值)
from django.db.models import Q
# 查询id大于2或者阅读量大于20的书籍
BookInfo.objects.filter(Q(id__gt=2) | Q(readcount__gt=20))
BookInfo.objects.filter(Q(id__gte=3) | Q(commentcount__gt=80))
# 查询书籍id不为3
# exclude方式
BookInfo.objects.exclude(id=3)
# Q对象方式
BookInfo.objects.filter(~Q(id=3))