目的:实现数据模型与数据库的解耦-----减少基于数据库的维护
效果:这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动
Django中的模型包含存储数据的字段和约束,对应着数据库中唯一的表
支持:主流的关系型数据库
链接到Mysql
①在mysql中创建数据库
mysql -u root -pcreate database test2 default charset utf8;
当然用Navicat更快
在Setting.py中配置mysql信息
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'test2', 'USER': 'root', 'PASSWORD': '', 'HOST': 'localhost', 'PORT': '3306', } }
如果使用的是python3会直接报错
原因:django 连接mysql默认驱动是MySQLdb,MySQLdb没有支持python3的版本,如果使用python3.x版本时,django连接mysql的方法需要在setting同级目录的__init__.py文件中写入 import pymysql pymysql.install_as_MySQLdb()
(使用mysqlclient代替MySQLdb,mysqlclient项目在github上的地址为 https://github.com/PyMySQL/mysqlclient-python,该项目fork MySQLdb,加入了对python3的支持)
使用前需要先安装, 然后在生成迁移文件
pip install mysqlclient
生成迁移(生成表)
python manage.py migrate去数据库可以看到,生成了很多表
bookinfo表的结构
在python manage.py shell中可以查询
from booktest.models import BookInfo # 查询1 BookInfo.books1.all() # 查询2 BookInfo.books2.all()在管理器类中定义一个对象方法,
class BookInfoManager(models.Manager): def get_queryset(self): return super(BookInfoManager, self).get_queryset().filter(isDelete=False) def create(self, btitle, bpub_date): b = BookInfo() b.btitle = btitle b.bpub_date = bpub_date b.bread = 0 b.bcomment = 0 b.isDelete = False return b
在python manage.py shell中创建对象
数据库中已经保存成功
数据的增删改可以在Admin中处理,这里要讲的是查询数据
查询集:查询的结果
惰性执行:创建查询集不会访问数据库,调用数据,才会访问数据库(迭代,序列化,if合用,才会立即拿数据)
过滤器:返回查询集的方法----------调用管理器中get_querset()方法(返回最原始查询计划)
all():获取所有数据
fiter():可以写筛选条件(类where)---获取满足条件的数据(常用)
exclude():可以写筛选条件(类where)---获取不满足条件的数据
order_by():排序
values():将查询结果(只要有一个对象)构成字典,然后构成一个列表返回(相当于json)
返回单个值:
get():返回单个满足条件的对象(常用)
未找到:抛异常
找到多条:抛异常
count():返回当前查询的总条数(常用)
first():返回满足条件的第一条
last():返回最后一条
exists():存在返回true
限制查询集:(不支持负数索引)---就相当于列表
BookInfo.books2.all()[0:2]
查询集缓存:
将查询结果:两次循环使用同一个查询集,第二次使用缓存中的数据
querylist=Entry.objects.all() print([e.title for e in querylist]) print([e.title for e in querylist])不缓存的情况:(子集的时候)
query = BookInfo.objects.all() # 缓存 for ... in query[0:10] # 不缓存 for ... in query[11:20]
语法:属性名称__比较运算符=值
BookInfo.books2.filter(btitle__endswith='传')不需要转义百分号%
filter(title__contains="%")=>where title like '%\%%'
比较运算符:
exact:判断相等(大小写敏感),可以省略
contains:是否包含,大小写敏感
BookInfo.books2.filter(btitle__contains='传')startswith、endswith:以value开头或结尾,大小写敏感
BookInfo.books2.filter(btitle__endswith='传')isnull、isnotnull:是否为null(区分大小写)
BookInfo.books2.filter(btitle__isnull=False)在前面这些比较运算符前面加字母i,意为不区分大小写,例如iexact、icontains、istarswith、iendswith
in:范围内
BookInfo.books2.filter(id__in=[1,2,3,4])gt、gte、lt、lte:大于、大于等于、小于、小于等于
BookInfo.books2.filter(id__gt=2)year、month、day、week_day、hour、minute、second:对日期间类型的属性进行运算
BookInfo.books2.filter(bpub_date__year=1980) BookInfo.books2.filter(bpub_date__gt=datetime(1980, 12, 31))跨关联关系的查询:处理join查询
BookInfo.books1.filter(heroinfo__hcontent__contains='八')查询的快捷方式:pk,pk表示primary key,默认的主键是id
先引入
from django.db.models import Max
django支持对F()对象使用算数运算
list.filter(bread__lt=F('bcomment')*2)F()对象中还可以写作“模型类__列名”进行关联查询
list.filter(isDelete=F('heroinfo__isDelete'))逻辑与如下:
list = BookInfo.books1.filter(pk__lt=6,btitle__contains='八')等同于:
list = BookInfo.books1.filter(pk__lt=6).filter(btitle__contains='八')from django.db.models import Q list = BookInfo.books1.filter(Q(pk__lt=4)|Q(btitle__contains='1'))
取反
list.filter(~Q(pk__lt=6))
转载于:https://www.cnblogs.com/shuimohei/p/10662641.html
相关资源:各显卡算力对照表!