1. django的ORM
ORM : 对象关系映射, 用python的概念表达数据库
2. 数据库配置(MySQL)
- 安装pymysql
pip install pymysql -i https://pypi.doubanio.com/simple
- 修改项目目录下的
__init__.py
如果同步不过来将项目关闭再打开就会自动同步。
import pymysql
pymysql.install_as_MySQLdb()
- 手动创建一个当前项目的空的数据库,准备一个有创建数据库权限的用户
- settings 配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'crm',
'USER': 'root',
'PASSWORD': 'qwe123',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
3. 模型的创建与映射
模型
就是 django.db.models.Model
的一个子类
模型定义在app文件夹下的models.py
文件
class Student(models.Model):
'''
# id = models.AutoField(primary_key=True)
# 可以省略,每一个模型(如果没有的话)django都会自动创建一个主键
'''
name = models.CharField(verbose_name='姓名', max_length=20)
age = models.SmallIntegerField(verbose_name='年龄')
sex = models.SmallIntegerField(default=1)
qq = models.CharField(max_length=20, null=True)
phone = models.CharField(max_length=20,null=True)
time = models.DateTimeField(verbose_name='创建时间')
字段
-
models.CharField
字符串字段 必须设置max_length参数 -
models.SmallintegerField
数字 数据库中的字段有:tinyint、smallint、int、bigint -
models.DateTimeField
日期时间类型 datetime
auto_now:保存时自动设置该字段为现在日期,最后修改日期
auto_now_add:当该对象第一次被创建时自动设置该字段为现在日期,创建日期。
参数
-
max_length
字段的最大字符数,作用于数据库层级和 Django 的数据验证层级。 -
verbose_name
Admin中字段的显示名称,如果不设置该参数时,则与属性名。 -
default
默认值 -
null
如果是True,Django会在数据库中将此字段的值置为NULL,默认值是False
激活映射
-
注册应用 (模型依赖注册,必须注册)
-
创建迁移(在根目录下执行) 只是告诉django,我们修改了模型,它不会操作数据库
python manage.py makemigrations appname 注:如果不加app名就代表迁移所有的已注册的的app
如果我们想看,我们的更改,会对数据库产生什么影响,我们可以看它大概会执行什么sql语句
python manage.py sqlmigrate appname number
- 执行迁移 操作数据库,将对模型的改动应用到数据库(底层就是执行了sql)
注:如果不加app名就代表执行所有的已注册的的app没有执行的迁移
python manage.py migrate appname
模型映射到数据库中是一张表 ,表名 = appname_模型name (小写)
执行上面的命令,到底干了些什么?
-
在app中查找迁移文件,并且去django_migrations表中查找,如果有没有执行的迁移文件,就去执行它
-
执行了迁移生成的sql语句
-
如果成功,会在django_migrations表中增加一条记录
一旦需改了模型就要先创建迁移然后在执行迁移
4. 简单的数据的增删改查
django调试环境(跟普通的python解释器没有任何的区别,只不过是把当前django项目需要的环境变量自动的加载到python解释器里来,就可以在解释器里非常方便的导入django的app的包)
python manage.py shell
增
第一种方式
In [2]: from teacher.models import Student
In [3]: s = Student()
In [4]: s.name = '小明'
In [5]: s.age = 18
In [6]: s.save() # save之后才会写到数据库
In [7]: student.object.all() # 查表里有多少条数据
第二种方式
stu = Student.objects.create(name='小华', age=16) # 直接创建
删
s.delete()
(1, {'teacher.Student': 1})
删多条
In [14]: Student.objects.filter(sex=1).delete()
Out[14]: (1, {'teacher.Student': 1})
改
改一条
In [15]: stu.age
Out[15]: 16
In [16]: stu.age = 19
In [18]: stu.save() # 改完之后要save才会写到数据库
改多条
In [9]: In [8]: Student.objects.all().update(sex=0)
Out[9]: 2
带条件改
查
查所有
In [3]: Student.objects.all()
Out[3]: <QuerySet [<Student: 小华>]>
查一条
In [7]: Student.objects.get(pk=2) #pk是主键
Out[7]: <Student: 小华>
#get返回的是对象 如果返回了多值就会报错
带条件
In [10]: Student.objects.filter(sex=1,name='小华')
Out[10]: <QuerySet [<Student: 小华>]>
In [8]: res = Student.objects.filter(sex=1,name='小华') # where sex=1
In [9]: res
Out[9]: <QuerySet [<Student: 小华>]>