1.数据库的链接配置
django里mysql的连接流程
安装--pip install pymysql
创建数据库用户
有创建数据库的权限的用户
创建数据库
crm
修改配置
setings
DATABASES = { ‘default‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, ‘NAME‘: ‘crm‘, ‘USER‘:‘root‘, ‘PASSWORD‘:‘qwe123‘, ‘HOST‘:‘127.0.0.1‘, ‘PORT‘:‘3306‘, } }
修改项目文件(setings所在的文件夹)下的__init__.py文件
写上
import pymysql pymysql.install_as_MySQLdb()
2.django的orm系统
https://baike.baidu.com/item/ORM/3583252?fr=aladdin
创建一个在编程文件可用的虚拟数据库or 将代码命令映射成数据库命令
模型类--数据表
类属性----表的字段名
3.模型的创建的和激活
1模型类必须写在app下的models.py文件中
2模型要映射到数据库 其所在的app必须要安装
小结:
每一个模型都是django.db.models.Model的子类
类变量 表示数据库字段(一列或者一行数据)
每一个字段有一个字段类的实例表示
from django.db import models # Create your models here. class Student_User(models.Model): name = models.CharField(max_length=30) #字符串 age =models.SmallIntegerField(default=18) #数字 默认值 sex= models.SmallIntegerField(default=1) qq=models.CharField(max_length=20,default=‘‘)#字符串比int好操作 phone=models.CharField(max_length=20,default=‘‘) c_time=models.DateTimeField(verbose_name=‘创建时间‘,auto_now_add=True) #提示给人看的 ##auto_now_add=True #自动添加不用特地写 ## 对应sql语句 -- -- Create model Student_User -- CREATE TABLE `video_student_user` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(30) NOT NULL, `age` smallint NOT NULL, `sex` smallint NOT NULL, `qq` varchar(20) NOT NULL, `phone` varchar(20) NOT NULL, `c_time` datetime(6) NOT NULL); COMMIT;
模型应用三步
1配置
数据库要先建立
app要注册
2建立模型
3运行数据库迁移命令(在项目根目录下)
1.python manage.py makemigrations appname
告诉django我们做了哪些数据库更改 并希望时装
目前只是做一个记录 还没touch数据库
i.可以运行 python manage.py sqlmigrate appname 从迁移获取sql语句
2.运行 python manage.py migrate appname 完成迁移
4.数据的增删改查
-工具 django shell 调试工具
命令 python manage.py shell 进入调试工具
导入
In [1]: from video.models import Student_User In [2]: Student_User.objects Out[2]: <django.db.models.manager.Manager at 0x7fe4f810fcc0> In [3]: Student_User.objects.all() Out[3]: <QuerySet []>
-增加
1.实例然后保存
In [4]: s1=Student_User(name=‘ziyu‘,age=‘20‘,qq=‘123456‘)
In [5]: s1.save
2.实例增加然后保存
In [8]: s2 =Student_User()
In [9]: s2.name= ‘zy‘
In [10]: s2.age= 18
In [11]: s2.save()
3.直接创建
in[13]:Student_User.objects.create(name=‘aa‘,age=‘23‘)
4.查找或创建
In [5]: s=Student_User.objects.get_or_create(name=‘zy‘)
In [6]: s
Out[6]: (<Student_User: zy-18>, False) False 代表是否有过创建
显示
在models的文件下面定义如下代码来修改 class.objecti.all()方法的输出结果
def __str__(self): return ‘%s-%s‘%(self.name,self.age)
-查找
1.查找全部
res= Student_User.objects.all() # #res等于这条语句对应的sql语句并非等于这个运行结果 print(res.query)查看对应的sql语句 (res可以for循环可以迭代可以切片)
2.查找一条
Student_User.objects.get(name=‘zy‘) 当有多条符合条件时报错(常常与pk代表主键这里是id连用) Student_User.objects.get(pk=2)
3.条件过滤(返回查询集)
res= Student_User.objects.filter(‘sex‘=1)
-修改
1.
首先查到相应的数据
然后直接赋值
在保存
2.update(批量修改0
例
Student_User.object.filter(name=‘ziyu‘).update(age=‘20‘)
不能与get连用可以与all连用
-删除 (同update)
先get
然后 .delete
5.数据库的调用
from appname.models import classname 【变量name】= classname.objects.all()
模型的调用
--常用字段类型 https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-types
--常用字段类型的对应
- int --IntegetField
- varchar -- CharField
- longtext --TextField
- date -- DateField
- datetime --DateTimeField
--常用参数
https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-options
primary_key: 指定是否为主键。
自定义主键的创建:AutoField(primary_key=ture)
unique: 指定是否唯一。
null: 指定是否为空,默认为False。
blank: 等于True时form表单验证时可以为空,默认为False。
default: 设置默认值。
DateField.auto_now: 每次修改都会将当前时间更新进去,只有调用,QuerySet.update方法将不会调用。这个参数只是Date和DateTime以及TimModel.save()方法才会调用e类才有的。
DateField.auto_now_add: 第一次添加进去,都会将当前时间设置进去。以后修改,不会修改这个值
--常用查询方法
通过模型类上的管理器来构造Queryset
-模型类上的管理器是指 .object
-Queryset 表示数据库中对象的集合。
·-等同于select语句。惰性的
all()获取所有记录(返回queryset)(queryset.query == mysql语句)
first()返回第一条记录(返回一个数据对象)
last()返回最后一条记录(...)
first()和last()-引出排序规则---默认通过主键。可以通过_meta设置
get(**kwargs)根据给定的条件获取一个对象,有对个符合条件的结果时报错
filter(**kwargs)根据给定的条件获取一个过滤后的queryset,多个条件逗号隔开。效果为and
exclude(**kwargs)(用法和filter相同结果相反)返回所有条件外的
or 多条件查询:使用Q对象(例 filter(Q(age=0)|Q(age=1)))
需要导入from django.db.models import Q
values(*fields):返回相应字段返回一个queryset,返回一个字典列表。(fields:某字段)返回结果任然可以过滤
only(*fields):返回queryset,对象列表,(注意only一定会包含主键字段)
对比value 对了一个key。返回结果不同。一般only比较高效。
defer(*fields)返回queryset,用法与only相同作用与only相反
order_by(*fields)根据给定的字段来来排序在字段名前加-反向排序例‘-name’
考虑排序规则(尤其是在对中文排序时)
多字段排序:(‘1字段’,‘2字段’)则先按‘1字段排序’在按‘2字段’排序
切片返回的多给对象都可以用列表的切片语法进行切片
对应mysql里的LIMIT和OFFSET
支持步长但是结果返回成列表(全部拿出来之后在切片不是在取值的时候切)效率不高
不支持负索引
****注意 切完片之后不在支持,附加条件与排序
--常用查询条件(以双下划线来调用)
exact 准确匹配 使用:在字段后加‘__exact‘ 例:(get(id__exact=14))
iexact 不分大小写 匹配 对应 mysql语法 LIKE(模糊匹配)使用:__
contains 包涵 也是对应 LIKE BINARY %name% 例:(filter(name__contains=‘name‘))
icontains 不分大小写包涵 LIKE %name%
in 在一定范围内的条件下检索 例:(filter(name__in=[‘name‘,‘name1‘,‘name2‘]))
range 数字版 的 in 例:(filter(name__range=(18,20))
gt 大于 例:((filter(id__gt=18))大于18的id
gte 大于等于
lt 小于
lte小于等于
startswith 以任意字符开头 对应 LIKE BINARY name% 例:filter(name__startswith=‘n‘)以n开头的name
istartswith 大小写不敏感
endswith
iendswith
isnull 返回 True False 对应 SQUry 里IS NULL IS NOT NULL例:res.filter(age__isnull=False) 不为空则返回
注释:res= tablename.objetct.all()
Lower() :例: order_by(Lower(‘name‘))
导入 from django.db.models.function
这时候order的反向方法不在适用应用order_by(Lower(‘name‘)).desc()
对应mysql里的DESC
--聚合
导入: from django.db.models import Count,Avg.Max,Sum,Count
然后通过 queryset的aggregate的方法
- count :计数 例子 res.filter(age__isnull=False) .count()
- 平均值 :res.aggregate(age_avg=Avg(‘age‘))
- 极值:res.aggregate(age_max=Max(‘age‘)) (等号前的是自定义的名字)
--分组,聚合
- annoate(num=Count(‘sex‘))
- 例子:
In [10]: ress=Student_User.objects.values(‘sex‘).annotate(num=Count(‘sex‘)) In [11]: ress Out[11]: <QuerySet [{‘sex‘: 1, ‘num‘: 5}]>
原文地址:https://www.cnblogs.com/zy0307/p/10540050.html