ORM : 对象关系映射, 用python的概念表达数据库
pip install pymysql -i https://pypi.doubanio.com/simple
import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'crm',
'USER': 'root',
'PASSWORD': 'qwe123',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
模型
就是 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
python manage.py migrate appname
模型映射到数据库中是一张表 ,表名 = appname_模型name (小写)
执行上面的命令,到底干了些什么?
在app中查找迁移文件,并且去django_migrations表中查找,如果有没有执行的迁移文件,就去执行它
执行了迁移生成的sql语句
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: 小华>]>