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()
posted on 2024-06-26 21:09  晓雾-Mist  阅读(38)  评论(0)    收藏  举报