ORM操作
一般操作
必会部分:
1.all() 查询所有结果,最终的结果为QuerySet对象.
models.Press.objects.all() # 查询所有出版社
2.values(*field) 返回一个ValueQuerySet —— 一个特殊的QuerySet,运行后得到的并不是一些列的model的实例化对象。而是一个可迭代的字典序列。简单点说就是ValueQuerySet列表中包含着查询到的结果,每一个结果为一个字典,字典中键为field字段,值为查到的结果。当field不写时,查询到所有的字段。
models.Press.objects.all().values() # 查询所有对形象的所有字段,每条记录为一个字典
models.Press.objects.all().values('id', 'name') # 查询所有对象的id和name字段,每条记录为一个字典
3.values_list(*field) 与values()非常相似,区别就是他返回的是一个元祖序列.
models.Press.objects.all().values_list() # 查询所有对形象的所有字段,每条记录为一个元祖,顺序为values_list()中填写的字段的顺序
models.Press.objects.all().values_list('id', 'name') # 查询所有对象的id和name字段,每条记录为一个元祖,顺序为values_list()中填写的字段的顺序
4.添加数据
A:添加一条数据:
models.UserInfo.objects.create(name='lxx',age=23, ut_id=2)
B:创建一个字典添加数据:
dict = {"name":'xxx', 'age':23, 'ut_id':3}
models.UserInfo.objects.create(**dict)
添加多条数据:
info = [
models.UserInfo(name='root1', age=34, ut_id=1),
models.UserInfo(name='root2', age=35, ut_id=2),
models.UserInfo(name='root3', age=36, ut_id=1),
models.UserInfo(name='root4', age=37, ut_id=3),
models.UserInfo(name='root5', age=32, ut_id=1),
]
models.UserInfo.objects.bulk_create(info)
5.删除数据
models.Userinfo.objects.filter(id=3).delete()
6.更新数据
models.UserInfo.objects.filter(id=3).update(name='lll', age=23)
7.正向查询
查询所有用户的用户类型
res = models.UserInfo.objects.all()
for obj in res:
print(obj.name, obj.age, obj.ut.title)
8.反向查询
res = models.UserType.objects.all()
for obj in res:
#### 表名小写_set
# print(obj.title, obj.userinfo_set.all())
#### releate_name的方式
print(obj.title, obj.users.all())
ORM查询用法大全
1.字段名过滤
1.__gt. greater than 大于
ret = models.Person.objects.filter(id__gt=1) # 查询id大于1的所有对象
2.__gte. greater than equal 大于等于
ret = models.Person.objects.filter(id__gte=1) # 查询id大于等于1的所有对象
3.__lt .less than 小于
ret = models.Person.objects.filter(id__lt=4) # 查询id小于4的所有对象
4.__lte.less than equal 小于等于
ret = models.Person.objects.filter(id__lte=1) # 查询id小于等于1的所有对象
2.字段名__in------(in)
ret = models.Person.objects.filter(id__in=[1, 3]) # 查询id在列表里的所有对象
3.exclude(**kwargs)------(not in) 它包含了与所给筛选条件不匹配的所有对象,最终结果为QuerySet对象.
models.Press.objects.exclude(id=1) # 查询id不等于1的所有出版社
4.get(**kwargs) 返回与所给筛选条件相匹配的对象,返回结果只有一个,如果符合筛选条件的对象超过一个或者一个也没有,就会报错.最终结果为一个对象.
models.Press.objects.get(id=1) # 查询id等于1的出版社
5.字段名__range=[条件1, 条件2]等价于 字段名gte=条件1,字段名lte=条件2,其中逗号(,)表示and关系.[条件1, 条件2]为闭区间.--------(between...and)
ret = models.Person.objects.filter(id__gte=1, id__lte=3) # 查询id大于等于1,小于等于3的所有对象
ret = models.Person.objects.filter(id__range=[1, 3]) # 查询id在1到3之间的所有对象
6.__startwith--__endswith--__contain-------(like)**
##### where name like 'like%'
##### g:全局 global i: ignore (忽略大小写)
res = models.UserInfo.objects.filter(name__startswith="ze")
res = models.UserInfo.objects.filter(name__istartswith="zekai")
##### where name like '%kk'
res = models.UserInfo.objects.filter(name__endswith="kkk")
res = models.UserInfo.objects.filter(name__iendswith="jjj")
##### where name like '%hhh%'
res = models.UserInfo.objects.filter(name__contains='hhh')
res = models.UserInfo.objects.filter(name__icontains='ggg')
###正则
res = models.UserInfo.objects.filter(name__regex="^zekai$")
7.count返回数据库中匹配查询(QuerySet)的对象数量.
#### select count(*) from userinfo where id>3;
#### select count(id) from userinfo where id>3;
res = models.UserInfo.objects.filter(id__gt=3).count()
8.order_by(*field) 对查询结果进行排序.最终的查询结果为QuerySet对象.当给*field前边加负号(-)时,按降序排序.
from django.db.models import Count, Min, Max, Sum
1 models.Press.objects.all().order_by('-id') # 查询结果按照id降序排列.结果为QuerySet对象.
2 models.Press.objects.all().order_by('age','-id') # 查询结果先按照age字段增序排列,出现相同age时再按照id降序排列.结果为QuerySet对象.
9.group by
### select id, sum(age) as s, username from userinfo group by username
from django.db.models import Count, Min, Max, Sum
res = models.UserInfo.objects.values("name").annotate(s=Sum('age'))
print(res.query)
### select id, sum(age) as s, username from userinfo group by username having s > 50;
res = models.UserInfo.objects.values("name").annotate(s=Sum('age')).filter(s__gt=50)
10.limit
##### limit 0, 10 分页
res = models.UserInfo.objects.all()[1:4]
# print(res)
11.first() 返回第一条记录(对象),必须是返回结果为QuerySet时才能使用first()
models.Person.objects.all().first()
12.last() 返回最有一条记录(对象),必须是返回结果为QuerySet时才能使用last()
models.Person.objects.all().last()
13.only
res = models.UserInfo.objects.only('name')
14.defer --排除这个之外的信息
res = models.UserInfo.objects.defer('id')
15.Q-----(or)或者
from django.db.models import Q
res = models.UserInfo.objects.filter( Q(Q(id__gt=3) | Q(name='zekai')) & Q(age=23) )
16.F----循环增加
from django.db.models import F
models.UserInfo.objects.update(name=F('name')+1)
17.原生的sql 类似于pymysql
from django.db import connection, connections
cursor = connection.cursor() # cursor = connections['default'].cursor()
cursor.execute("""SELECT * from auth_user where id = %s""", [1])
row = cursor.fetchone()
print(row)
18.distinct() 从返回结果中剔除重复记录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果.此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重.),返回结果为QuerySet对象.
models.UserInfo.objects.values("name", 'age').distinct('name')
print(res.query) ### 查看上述代码生成的sql语句
19.exists() 如果QuerySet包含数据,就返回True,否则返回False.
models.Person.objects.all().exists()
20.reverse() 对查询结果进行反序排序,请注意reverse()通常只能在具有已定义排序的QuerySet上调用(在model类的Meta中指定order_by()或者调用ordering方法.)
models.Person.objects.all().reverse()