Django 模型models
1. 模型models
模型就是MTV开发模式的'M',是数据库系统
django可以直接使用sql原生语句
比如 connet = pymysql.connect(name='',password='',user='',host='')
cursor = connet.cursor()
cursor.execute('select * from dbname where ..')
connet.close()
但是不太好,不适用与所有的数据库系统,而且有风险
2. 使用models,那么必须建立app
python manage.py startapp books(应用名)
注册app,进入settings.py文件注册app
3. 关系映射模型ORM
django的models处理结果都是对象,而我们是使用关系型数据库,那么需要把这种对象操作映射成关系型数据库的sql语句
4. 检查模型是否正确
python manage.py check
如上截图所示,才是正确的模型设置;否则会有报错信息
5. 数据迁移
python manage.py makemigrations 迁移所有的数据库,可以再应用(app)里面的migrations目录下的 0001_initial.py 文件中查看迁移结果
python manage.py makemigrations books 迁移books应用
6. 上面的的makemigrations,完成迁移的命令,但是没有真正的迁移,还需要以下命令,migrate
python manage.py migrate
python manage.py migrate books
二、基本语句以及对应的sql语句
模型中的数据库名Publisher为例;Publisher也就是生成了表格books_publisher app名+models中的类名
(1) 插入数据
p1 = Publisher(name='Apress',address='2855 Telegraph Avenue',city='Berkeley',state_province='CA',country='USA',website='http://ww/apress.com')
这样还没有插入数据库表格中,还需要保存结果
p1.save()
另外一种插入方式:
p3 = Publisher.objects.create(name='APeer',address='234 Tlese Aveneus',city='Berykly',state_province='CA',country='USA',website='http://www.asdf.com')
这种方式不用save()
2. 得到表格中所有数据
publisher_list = Publisher.objects.all()
得到的是数据库中记录的对象,Queryset,是一个列表
3. 删选一些数据
Publisher.objects.filter(country='USA')
Publisher.objects.filter(country__contains='USA')
删选country中包含‘USA’的记录对象,两个下划线__contains, 和sql语句中的 like ‘%USA%’
Publisher.objects.filter(name__contains='press')[0].name
还有__icontains,忽略大小写,__startswith, __endswith, __range(sql between)
filter得到的也是记录对象的列表
得到一个数据:
Publisher.objects.get(name='Apress')
得到的是一个记录对象,如果有多个符合或者没有符合的都会报错
4.排序 order_by()
Publisher.objects.order_by('name')
逆序 order_by('-name') ;排序的字段加上 '-' 号
5. 更新数据
Publisher.objects.filter(id=1).update(name='Apress')
Publisher.objects.filter(country='USA').update(country='U.S.A')
还可以
>>> p = Publisher.objects.get(name='Apress')
>>> p.name ='Apress Publishing'
>>> p.save()
这样不是改变name一个字段数据,而是跟新了所有字段数据
6.删除数据
Publisher.objects.filter(id=3).delete()
清空数据表
Publisher.objects.all().delete()
谨慎使用