DJango中ORM操作
Django中的ORM使我们可以在不使用繁琐的sql语句的情况下,通过一两行代码就可以完成对数据库的一些操作,在我们配置完Django的ORM相关属性后,在处理业务逻辑的views.py文件中,就可以使用如下代码来操作了
增
-
models.表名.objects.create(字段1=值,字段2=值....)
-
dict = {'字段1':值,'字段2':值.......}
models.表名.objects.create(**dict)
-
info = [models.表名(字段1=值,字段2=值....),models.表名(字段1=值,字段2=值...)...]
models.表名.objects.bulk_create(info)
删
models.表名.objects.filter(条件).delete()
改
models.表名.objects.filter(条件).update(字段1=值,字段2=值...)
查
单表查询
-
res = models.表名.objects.all()
得到res:[obj,obj......],每个obj都代表一行记录,可以点出字段名
-
res = models.表名.objects.values()
得到res:[{字段1:值,字段2:值......},{字段1:值,字段2:值......}......]
-
res = models.表名.objects.values_list(字段1,字段2)
得到res:[(字段1的值,字段2的值),(字段1的值,字段2的值)......]
-
res = res = models.表名.objects.first()
得到res:obj 第一条记录
多表查询
正向查询:查从表,通过外键获得主表内容
res = models.从表名.objects.values(从表字段,外键名__主表字段)
反向查询:查主表,通过小写主表名_set获得从表内容
res = models.主表名.objects.values(主表字段,小写从表名_set.values(从表字段))
各种带条件的查询
-
过滤(where 字段名 = 值)
res = models.表名.objects.filter(字段名__gt=值)
得到res:字段值大于值的记录
res = models.表名.objects.filter(字段名__gte=值)
得到res:字段值大于等于值的记录
res = models.表名.objects.filter(字段名__lt=值)
得到res:字段值小于值的记录
res = models.表名.objects.filter(字段名__lte=值)
得到res:字段值小于等于值的记录
-
in和not in
res = models.表名.objects.filter(字段名__in=[2,4,6....])
相当于:where 字段名 in [2,4,6....]
res = models.表名.objects.exclude(字段名__in=[2,4,6....])
相当于:where 字段名 not in [2,4,6....]
-
between...and...
res = models.表名.objects.fliter(字段名__range=[6,9])
相当于:where 字段名 between 6 and 9
-
like
res = models.表名.objects.fliter(字段名__startswith=字符)
相当于:where 字段名 like '字符%'
res = models.表名.objects.fliter(字段名__istartswith=字符)
相当于上面的查询忽略大小写匹配
res = models.表名.objects.fliter(字段名__endswith=字符)
相当于:where 字段名 like '%字符'
res = models.表名.objects.fliter(字段名__iendswith=字符)
相当于上面的查询忽略大小写匹配
res = models.表名.objects.fliter(字段名__contains=字符)
相当于:where 字段名 like '%字符%'
res = models.表名.objects.fliter(字段名__icontains=字符)
相当于:上面的查询忽略大小写匹配
res = models.表名.objects.fliter(字段名__regex='匹配规则')
相当于以这个正则表达式;匹配规则'来进行查询
-
count
res = models.表名.objects.fliter(字段名__gt=值).count()
得到:字段名的值大于值的记录的个数
-
order by
res = models.表名.objects.all().order_by('字段1','字段2'..)
得到:根据先字段1再字段二再...来正序排序的记录
res = models.表名.objects.all().order_by('-字段1','字段2'..)
得到:根据先字段1再字段二再...来倒序排序的记录
-
group by
from django.db.models import Count, Min, Max, Sum
res = models.表名.objects.values('作为分组依据的字段').annotate(别名=聚合函数('字段名')) -
limit
res = models.表名.objects.all()[1:4]
得到:第2,3,4条记录
-
last
res = models.表名.objects.last()
得到:最后一条记录
-
only
res = models.表名.objects.only('字段名')
只查询这个字段名
-
defer
res = models.表名.objects.defer('字段名')
除了这个字段名都查
-
or
Q的使用:
from django.db.models import Q
res = models.表名.objects.filter( Q(Q(字段1__gt=值1) | Q(字段2=值2)) & Q(字段3=值3) )
相当于:筛选出字段1大于值1或字段2等于值2的并且需要的记录要字段3等于值3
F的使用
from django.db.models import F
models.UserInfo.objects.update(age=F('字段')+'1')
相当于:将表中这个字段的值都加1
-
如果以上的方法不能满足需求,还可以使用原生sql语句
from django.db import connection, connections
cursor = connection.cursor()
cursor.execute(''sql语句'', [参数])
row = cursor.fetchone()