ORM模型
- objectRelationMap:把面向对象的思想转换成关系型数据库
- 类去对应表格
- 类中的属性对应表中的字段
- 在应用中的models.py文件中定义class
- 所有需要使用的ORM的class都必须时
models.Model
的子类 - class中的所有属性对应表格中的字段
- 字段的类型都必须使用
models.xxx
不能使用python中的
django链接数据库
- 自带默认清亮型数据库Sqllite3
- 建议开发时使用Sqllite3,部署时使用mysql等数据库
#django链接mysql数据库
#1. 使用其他数据库时,只要修改setting中的下面代码即可
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '数据库名',
'PASSWORD':'数据库密码',
'HOST':'127.0.0.1',
'PORT':'3306',
}
}
#2. 需要在项目文件夹下的__init__文件中导入pymusql包
import pymysql
pymysql.install_as_MySQLdb()
models类的使用
-
定义和数据库表映射的类
- 在app中的models.py文件中定义class
- 所有需要使用ORM的class都必须是models.Model的子类
- class中的所有属性对应表格中的字段
- 字段的类型都必须使用models.xxx,不能使用python中的类型
-
字段的常用参数
- max.length:规定数值(表格中的每一项,如姓名长度)的最大长度
- blank:是否允许字段为空,默认是False不允许
- nall:在DB中控制是否保存为null,默认为False
- default:默认值
- unique:唯一
- verbose_name:假名
#新建的表格
class mulu(models.Model):
mingcheng = models.CharField(max_length=10)
xinghao = models.CharField(max_length=30)
changjia = models.CharField(max_length=10)
shuliang = models.IntegerField()
#添加后可以使查询表单目录时候,更有可读性
def __str__(self):
return self.mingcheng
-
数据库的迁移
- 在命令行中,生成数据迁移的语句(生成sql语句)
- 在命令行中,输入数据迁移的指令,如果迁移中出现没有变化或者报错,可以尝试强制迁移
- 对于默认数据库,为了避免出现混乱,如果数据库中没有数据,每次迁移前可以将自带的sqlite3数据库和app下的migrations文件夹删除
- 正式迁移,前几步只是预备步骤,此步骤为真正的迁移
#正常生成数据迁移指令
python manage.py makemigrations
#正常迁移指令
python manage.py migrate
#强制生成数据迁移指令
python manage.py makemigrations 应用名
#强制迁移指令
python manage.py migrate 应用名
#正式迁移
python manage.py migrate
命令行(shell)操作
- 启动虚拟环境下的python命令行:
python manage.py shell
。注意:对ORM的操作分为静态函数和动态函数,静态函数是指所有类实例公用的属性 - 在命令行中导入,建好的表格类:
from 应用名.models import 类名
- 使用
object
属性操作数据库.object
是模型中实际和数据库进行交互的 - 查询命令
- 类名.objects.all() 查询数据库表中的所有内容,返回的结果是一个Query类型
- 类名.objects.filter(条件)
- 对数据库结构的改变,需要重启shell才能生效,如改变models.py文件中的数据库结构
>>> from gongneng.models import mulu
#实例化表单
>>> m = mulu()
#插入值
>>> m.mingcheng = "电磁阀"
>>> m.xinghao = "AD66"
>>> m.shuliang = 5
#保存实例
>>> m.save()
#实例化目录列表
>>> l = mulu.objects.all()
>>> l
[<mulu: mulu object>]
#查询数据库列表,第一项
>>> l[0]
<mulu: mulu object>
#查询数据库列表,第一项的,各个属性
>>> l[0].mingcheng
'电磁阀'
>>> l[0].xinghao
'AD66'
>>> l[0].changjia
''
>>> l[0].shuliang
5
#查询shuliang属性等于5的项
>>> c = mulu.objects.filter(shuliang=5)
>>> c
[<mulu: mulu object>]
- 常见的查找方法
- 常用查找格式:属性名__(加入下面的内容) = 值
- gt:大于
- gte:大于等于
- lt:小于
- lte:小于等于
- range:范围
- year:年份
- isnull:是否为空
- 模糊查找:属性名__(加入下面的内容) = 值
- exact:精确等于
- iexact:不区分大小写
- contains:包含
- startwith:已XX开头
- endwith:已XX结尾
- 常用查找格式:属性名__(加入下面的内容) = 值
>>> c = mulu.objects.filter(shuliang__gte=5)
>>> c
[<mulu: mulu object>]
>>> c = mulu.objects.filter(xinghao__contains="AD")
>>> c
[<mulu: mulu object>]