51.Django之ORM操作
Django之ORM操作初识
【一】配置数据库
1)默认数据库
- 在settings.py内有一个配置项就是配置数据库,默认为sqlite3数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
2)指定数据库
-
修改数据库配置
-
模板
DATABASES = { 'default': { # 指定使用的引擎为 'ENGINE': 'django.db.backends.mysql', # 数据库用户名 "USER": "root", # 数据库密码 "PASSWORD": "123456", # 数据库 IP,本地默认是127.0.0.1/localhost "HOST": "localhost", # 数据库端口 "PORT": 3306, # 数据库编码 "CHARSET": "utf8mb4", # 连接的数据库名字 'NAME': "", } }
3)遇到报错
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
1.打猴子补丁
-
随便找个文件输入如下,之后重启
import pymysql pymysql.install_as_MySQLdb()
2.安装 mysqlclient
pip install mysqlclient
【二】ORM介绍
1)概念
- ORM是一种在对象与关系型数据库之间的映射技术,主页实现如下功能:
- 数据库中的 表 映射为Python中的类
- 数据库中的 字段 映射为Python中的属性
- 数据库中的 记录 映射为Python中的实例
2)优点
- 简单易用
- 丰富的API
- 良好的扩展性
- 自动映射
【三】表操作
1)定义模型表
- 在models.py内定义模型
# 定义模型表,类名默认为表名
class User(models.Model):
# 定义表字段(max_length:字符串最大长度,verbose_name:注解)
username = models.CharField(max_length=20, verbose_name='用户名')
password = models.CharField(max_length=20, verbose_name='密码')
age = models.IntegerField(verbose_name='年龄')
2)数据库迁移
- 执行方法
- 终端
1.生成迁移文件
- 将操作记录记录在migrations文件夹
python manage.py makemigrations
2.迁移记录生效
- 将操作同步到真正的数据库
python manage.py migrate
3.补
- 只要修改了models中有关数据库相关的代码,就必须执行上面的数据库迁移命令
【四】字段操作
1)字段属性
1.允许为空
-
可为字段添加 null=True 属性以允许其值为None或空
class Eg(models.Model): name=models.CharField(max_length=20, null=True)
2.指定默认值
-
可为字段添加 default=默认值 参数以设置字段默认值
class Eg(models.Model): name=models.CharField(default='ST1')
2)字段添加
-
直接在原本的模型表上增加 BooleanField 字段
-
迁移数据库 执行两个命令
from django.db import models class MyModel(models.Model): name = models.CharField(max_length=50) # 新增一个自动记录创建时间的datetime字段 created_at = models.DateTimeField(auto_now_add=True)
python manage.py makemigrations python manage.py migrate
3)字段删除
-
直接在原本的模型表上注释掉 指定 字段
-
迁移数据库 执行两个命令
from django.db import models class MyModel(models.Model): name = models.CharField(max_length=50) #删除 created_at字段
python manage.py makemigrations python manage.py migrate
【五】数据库操作
0)使用条件
-
在Django框架中 ,Django必须启动起来才能使用DjangoodeORM 语句
-
若不启动,需如下操作:
import os if __name__ == '__main__': # 在manage.py找到如下 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Django_eg.settings') # 引入Django模块 import django # 临时启动Django项目 django.setup() # 使用Django的模型表(from 应用名.models import 表名) from App.models import User
1)添加
模型表名.objects.create(字段名=字段值)
res_add = User.objects.create(username="ST2", password="222", age=20)
print(res_add)
# User object (2)
2)查询
1.获取当前表所有数据
模型表名.objects.all()
res_inquire = User.objects.all()
print(res_inquire)
# <QuerySet [<User: User object (1)>, <User: User object (2)>]>
2.获取指定的数据
模型表名.objects.get(筛选字段名=筛选字段值)
模型表名.objects.filter(筛选字段名=筛选字段值)
res_inquire = User.objects.get(username="ST1")
print(res_inquire)
# User object (1)
res_inquire = User.objects.filter(username="ST1")
print(res_inquire)
# <QuerySet [<User: User object (1)>]>
3.去除指定条件的数据
模型表名.objects.exclude(筛选字段名=筛选字段值)
res_inquire = User.objects.exclude(username="ST1")
print(res_inquire)
# <QuerySet [<User: User object (2)>]>
4.获取结构,用户数据
- 需拿到指定对象才能查看用户数据
res_inquire = User.objects.filter(username="ST1").first()
print(res_inquire)
# User object (1)
print(res_inquire.password)
# 111
3)更改
# 方式一:先查询直接修改
模型表名.objects.filter(筛选字段名=筛选字段值).update(修改字段名=修改字段值)
# 方式二:先查询后修改
obj = 模型表名.objects.get(筛选字段名=筛选字段值)
obj.修改字段名=修改字段值
obj.save()
User.objects.filter(id=1).update(password='101')
obj = User.objects.filter(id=1)
obj.password = '111'
obj.save()
4)删除
# 方式一:删除需要先查询直接删除
模型表名.objects.filter(筛选字段名=筛选字段值).delete()
# 方式二:删除需要先查询再删除
instance_to_delete = MyModel.objects.get(筛选字段名=筛选字段值)
instance_to_delete.delete()
User.objects.filter(id=2).delete()
table_delete = User.objects.get(id=2)
table_delete.delete()