Django(十一):ORM单表操作

ORM单表操作:  views.py里面
from models import *

t = Table() # 表单对象model是一个表记录, model只有attrssave()
manager = Table.objects # 表单的一个类属性是一个Manager对象, 用于管理表记录对象model

1. 增加记录
1>. 方式一: 创建表记录对象, 并添加
t = Table(**info)
t.save # 此时才会提交到数据库
2>. 方式二: 通过Manager对象添加
Table.objects.create(**info) # 直接提交到数据库

2. 查询表记录: 通过manager操作
QuerySetmodel的集合对象: 1) 可迭代
2) 可切片
3) 不会马上执行, 运行时执行, 并将数据存入QuerySet内置的cache
4)再次执行时从cache中拿数据
* 只需要判断数据有无, .exist()方法
* 当读取数据特别大时, .iterator()方法, 但数据不会存入cache
* 对于常用的数据, 存入cache; 不常用的用iterator()

.all() # SELECT * FROM Table, 查询全部, 返回QuerySet
.filter(**kwargs) # SELECT * FROM Table Where condition, 条件查找, 返回QuerySet
.get(**kwargs) # , 只能查找一个, 有多个或没有则报错, 返回model, 没有数据处理的方法

condition:
* 原始django_orm只有与',' 没有或非 ---> 引入Q查询
* from django.db.models import Q
* Q(condition) 封装过的条件可以有 & | ~
* Q查询可以与原始查询一起使用, 但一定要放在最前面

>a # field__gt = a
<a # field__lt = a
>=a # Q(field__gt=a) | Q(field=a)
<=a # Q(field__lt=a) | Q(field=a)
between a and b # field__range=[a,b]
in (a,b,c) # field__in=[a,b,c]
like= '%a%' # field__contains=a, 区分大小写; field_icontains=a, 不区分大小写
正则 # field__regex = r'', 区分大小写; field_iregex= r'', 不区分大小写

其他双下划线方法: __startswith, __istartswith, __endswith, __iendswith

/***************** 查询后的数据处理 *************************************/
.values(*field) # SELECT field,field2,.. 返回一个ValueQuerySet集合, 且每项是一个{field:value,}字典
.values_list(*field) # 每项是一个(value1,value2,)元组
// 去重
.distinct() # SELECT DISTINCT..
// 排序
.order_by(*field) # .. ORDER BY field1,.. 升序
.order_by(-*field) # 降序
.order_by(*field).reverse() # 反转
// 聚合
from django.db.models import Avg, Min, Max, Sum, Count
.aggregate(Avg('field'))
// 分组聚合
.values(*field).annotate([my_name]=Avg('field2')) # SELECT field1, field2, Avg(field) FROM Table GROUP BY field2

其他处理方式: .count() # 计数
.first(), .last() # 取第一个或取最后一个
.exist() # 若查找存在数据则返回True, 判断数据是否存在可用, 不需要读取全部数据, 不会放入cache
.defer('field') # 排除某列数据
.only('field') # 仅取某列数据
.using('defualt1') # 连接不同的数据库
当需要对整个field操作时
from django.db.models import F
manager.update(num=F('num')+1) # 包装field, 使其可以被调用



3. 删除记录
manager..delete() # 要注意get方法查到的是单条记录, 但都有delete方法

4. 更新记录
方式一: 通过QuerySet.update()
manager.filter().update(field=value) # 要注意get查到的是单条记录, 没有update方法
方式二: 通过model重写
obj = manager.filter()[0]
obj.field = new_value
obj.save() # 会将全部数据重新写入, 不推荐

* 自定义SQL语句
1. 完全自定义
from django.db import connection, connections
cursor = connection.cursor() # cursor = connections('default1').cursor()
2. 对当前manager自定义
manager.raw('sql',param=None,translations=None,using=None)
'sql' # SQL语句
param # 为该SQL语句传入的参数,避免写死,raw('select id as nid from userinfo where nid>%s', params=[12,])
translations # 列名转换, name_map = {'first': 'first_name', 'last': 'last_name'}
raw('SELECT * FROM some_other_table', translations=name_map)
using='default' # 使用哪个数据库
3. 利用extra函数对当前manager自定义
extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])

猜你喜欢

转载自www.cnblogs.com/lancelotxly/p/10871904.html