5-ORM操作

配置数据库

# 在 settings.py 文件中有一个配置项就是配置数据库的,一般为 DATABASES
# 但是Django默认的数据库是sqlite3数据库

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
# 模板文件,都建议大写,NAME这里不要写成DB或者DATABASE,会报错
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        # 数据库名字
        'NAME': "",
        # 数据库用户名
        "USER": "",
        # 数据库密码
        "PASSWORD": "",
        # 数据库 IP,本地默认是127.0.0.1/localhost
        "HOST": "localhost",
        # 数据库端口
        "PORT": 3306,
        # 数据库编码
        "CHARSET": "utf8mb4",
    }
}
from django.db.backends import mysql  # 然后顶部导入mysql 直接复制对应字段即可  django.db.backends

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 这里修改为mysql
        'NAME': 'db_django',
        'HOST': '127.0.0.1',
        'USER': 'root',
        'PASSWORD': '123',
        'CHARSET': 'utf8mb4',
        'PORT': 3306
    }
}

如果遇到报错

解决方案1,使用猴子补丁

# 在项目下的 __init__ 或者任意的应用名下的 __init__ 文件中书写一下代码
import pymysql

pymysql.install_as_MySQLdb()

解决方案2,下载mysqlclient模块

# 直接下载
pip install mysqlclient

# 如果下载失败,建议换源下载,比如豆瓣
pip install mysqlclient -i https://pypi.douban.com/simple

# 如果还是失败,搜索 mysalclient whell ,然后通过pip install 安装

ORM

ORM可以帮帮助我们做两件事:

  1. 创建、删除、修改数据库中的表。(不用写SQL语句),【无法创建数据库】
  2. 操作表中的数据。(不用写SQL语句)
类名    -->   表名
对象    -->   记录
属性    -->   字段

image-20240228183712671

常见Django模型字段在MySQL中的对应关系表

Django模型字段 对应MySQL字段 说明
AutoField INT AUTO_INCREMENT PRIMARY KEY 主键
CharField VARCHAR 字符串字段,指定最大长度
TextField TEXT 大段文本
IntegerField INT 整数
FloatField FLOATDOUBLE 浮点数
DateTimeField DATETIME 用于存储日期和时间
BooleanField BOOLTINYINT(1) 用于存储布尔值(True 或 False)
ForeignKey INT 外键

Django操作表

创建表, 需要在modles.py中去操作

from django.db import models


class UserInfo(models.Model):
    """
    max_length:长度 必须写,不写会报错
        ERRORS:
        app1.UserInfo.data: (fields.E120) CharFields must define a 'max_length' attribute.
    verbose_name:相当于commit,注释
    default:默认值
    null: 是否允许为空 null=True blank=True 就表示这一列字段可以为空
    """
    username = models.CharField(max_length=32, verbose_name="用户名")
    password = models.CharField(max_length=32, verbose_name="密码")
    age = models.IntegerField(verbose_name="年龄", null=False)
    gender = models.CharField(max_length=32, default="女")

"""
底层类似于写了这样的SQL语句
create table appname_userinfo(
    id bigint auto_increment primary key;
    username varchar(32);
    password varchar(32) unique;
    age int;
    gender varchar(32) default="女"
);
"""
# 依次执行下面两条方法
python manage.py makemigrations
python manage.py migrate

# 也可以通过Tools下面的Run manage.py Task...去执行
makemigrations
migrate

# 只要修改了models中有关数据库相关的代码,就必须执行上面的数据库迁移命令
# 执行这两条命令的前提是,APP必须已经注册到数据库里面了

# 数据库迁移命令 将操作记录到(migrations文件夹)中

在表中新增列时,由于已存在列中可能已有数据,所以新列必须要指定新增列对应的数据:

  1. 新增一个值
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py

# 如果输入1  会让你输入一个值,那么原有数据包括新增的这一列的字段都会改成这个值
# 如果输入2  会退出,然后建议您使用default设置一个新的值,那么原有的值的这个新增字段都会变成这个默认值
  1. 设定默认值

    gender = models.CharField(max_length=32, default="女")
    
  2. 允许为空

    data = models.CharField(max_length=32, null=True, blank=True)
    

如果要删除表或者删除某一个刚刚新建的没有数据的字段,直接注释掉,然后重新提交刚刚的两个语句就可以了

表中的数据

新增数据

xx.objects.create(xxx)

# 如果有默认值,可以不用写有默认值的字段
models.UserInfo.objects.create(username='兰陵王', password='123')

image-20240228193808149

删除数据

# 方式1
# xx.objects.filter(筛选条件).delete()
models.UserInfo.objects.filter(username='兰陵王').delete()

# 删除表里面的全部数据(危险操作)
# xx.objects.all().delete()
models.UserInfo.objects.all().delete()

获取数据

# xx.objects.all()
# 相当于 select * from table;
# 得到的是一个QuerySet的数据类型,可以理解为一个列表,列表是一行一行的数据[行,行,行]

models.UserInfo.objects.all()

data_list = models.UserInfo.objects.all()
print(data_list)  
# <QuerySet [<UserInfo: UserInfo object (5)>, 
# <UserInfo: UserInfo object (6)>, 
# <UserInfo: UserInfo object (7)>, 
# <UserInfo: UserInfo object (8)>]>

image-20240228195304199

通过对象.字段名去获取数据

data_list = models.UserInfo.objects.all()
for data in data_list:
	print(data.username, data.password, data.age)
# 大乔 123 3
# 阿珂 123 4
# 庄周 123 5
# 海月 123 6

可以筛选后,通过.first获取一行数据

data_obj = models.UserInfo.objects.filter(id="5").first()
print(data_obj.username, data_obj.password, data_obj.age)
# 大乔 123 3

更新数据

# 更新全部数据
models.UserInfo.objects.all().update(password="666")
# 更新一条数据
# xx.objects.filter(条件).update(字段=字段值)
models.UserInfo.objects.filter(username='海月').update(username="海月月")

image-20240228200220411

过滤数据

# xx.objects.exclude(条件)

# 筛选年龄小于4岁
obj = models.UserInfo.objects.filter(age__lt=4)
for item in obj:
	print(item.username, item.password, item.age)
# 大乔 666 3

# 筛选年龄大于4岁
obj = models.UserInfo.objects.filter(age__gt=4)
for item in obj:
	print(item.username, item.password, item.age)
# 庄周 666 5
# 海月月 666 6

# 筛选密码包含6的结果
obj = models.UserInfo.objects.filter(password__contains='66')
for item in obj:
	print(item.username, item.password, item.age)
# 大乔 666 3
# 阿珂 666 4
# 庄周 666 5
# 海月月 666 6
posted @ 2024-03-23 00:49  小满三岁啦  阅读(1)  评论(0编辑  收藏  举报