• django-ORM


    一、安装django

    [root@node5 ~]# pip3 install django==3.2.6
    
    • 1

    查看是否安装成功

    [root@node5 ~]# pip3 freeze  |grep -i dj
    Django==3.2.6
    
    • 1
    • 2

    二、创建项目

    #django-admin 是安装完django后产生的命令
    #django_project 为项目名称
    
    [root@node5 data]# django-admin startproject django_project . 
    [root@node5 data]# ls
    django_project
    [root@node5 data]# cd django_project
    [root@node5 test1]# ls
    manage.py  django_project
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    三、基本配置

    1.配置settings.py

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'mydatabase',
            'USER': 'admin',
            'PASSWORD': 'abc123,',
            'HOST': '192.168.1.103',
            'PORT': '3306',
        }
    }
    
    LANGUAGE_CODE = 'zh-Hans'
    TIME_ZONE = 'Asia/Shanghai'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    常用配置
    1.BASE_DIR:项目的绝对路径
    2.DEBUG: 启动模式
    	True: 调试模式
    		检测代码改动后,立刻重启服务
    	Fasle: 正式启动模式 / 上线模式3.ALLOWED_HOSTS: 允许访问本机的客户端主机,'*' 表示允许所有主机
    4.DATABASES: 连接的数据库
    5.LANGUAGE_CODE: 显示语言
    	zh-Hans 表示用中文显示
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.安装mysqlclient

    因为我们使用mysql作为后端,所以要安装mysqlclient库

    pip install mysqlclient
    
    • 1

    3.创建应用

    创建app1应用。发现在应用目录下多了app1目录

    python manage.py startapp app1
    
    • 1

    4.注册应用

    在setting.py中注册app1应用

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app1'  #在这里加入我们刚才创建的app1应用
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    5.创建对应的数据库表

    python manage.py migrate
    
    • 1

    6.启动django测试

    python manage.py runserver
    
    • 1

    四、ORM

    ORM对象关系映射,它允许你使用类和对象对数据库进行操作,从而避免通过SQL语句操作数据库
    模型层: 负责和数据库之间进行通信
    模型是一个Python类,它是由django.db.models.Model派生出的字类
    一个模型类代表数据库中的一张表
    模型类中每一个类属性都代表数据库中的一个字段
    模型是数据交互的接口,是表示和操作数据库的方法和方式

    1.创建模型类流程

    在"应用(app1)"下的models.py中编写模型类

    [root@node5 music]# vim models.py 
    #文件中自动导入了models包,因为这是一个包,其实就是执行了__init__.py文件。在此文件中又导入了base.py中的Model类
    from django.db import models
    
    • 1
    • 2
    • 3

    2.语法:

    模型类名也就是表名

    class 模型类名(models.Model):
    	字段名1 = models.字段类型(字段选项)
    	字段名2 = models.字段类型(字段选项)
    
    • 1
    • 2
    • 3

    3.实例

    3.1创建测试数据库
    mysql> create database mydb1;
    mysql> use mydb1
    mysql> show tables;
    Empty set (0.05 sec)
    
    • 1
    • 2
    • 3
    • 4
    3.2 创建model类
    打开应用(就是startapp命令创建的)下models.py
    class student(models.Model):
        class Meta:
            db_table = 'my_student'
    
        id = models.IntegerField(primary_key=True)
        name = models.CharField(max_length=20)
        age = models.IntegerField()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    解释:
    class student是模型类 继承models.Model类
    Meta: 是自定义生成的表名,如果不定义,表名就是"应用名" + "模型类"组合而成的表名
    id,name,age 分别是表中的字段
    
    • 1
    • 2
    • 3
    • 4
    3.3 开始创建表

    这个过程就是将类转换成sql的过程。django中这个过程叫做迁移

    python manage.py makemigrations
    python manage.py migrate
    
    • 1
    • 2

    3.4 验证

    mysql> use mydb1
    mysql> desc my_student; 我们发现我们已经创建了表
    
    • 1
    • 2

    五、插入数据

    1.方法1:

    student.objects.create(id=1,name='zhangsan',age=20)
    
    然后命令行执行
    python manage.py migrate
    
    • 1
    • 2
    • 3
    • 4

    2.方法2

    s1 = student(id=2,name='lisi',age=21)
    s1.save()
    
    • 1
    • 2

    六、查询数据

    在setting.py都配置好的情况下开始配置以下步骤

    1.创建数据库表

    我们在数据库中直接创建一个表,用于测试。这里不通过django自带迁移的功能的创建了。

    mysql> use mydb1
    mysql> create table my_students1(id int primary key auto_increment,name char(32),age int);
    mysql> insert into my_students1 (name,age) values('zhangsan',20),('lisi',20),('wangwu',21),('xiaohong',22),('xiaoming',23);
    mysql> select * from my_students1;
    +----+----------+------+
    | id | name     | age  |
    +----+----------+------+
    |  1 | zhangsan |   20 |
    |  2 | lisi     |   20 |
    |  3 | wangwu   |   21 |
    |  4 | xiaohong |   22 |
    |  5 | xiaoming |   23 |
    +----+----------+------+
    5 rows in set (0.00 sec)
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.创建模型类

    在应用下(app1)的models.py中创建模型类,与刚才在数据库中创建的表建立对应关系.

    class students1(models.Model):
        class Meta:
            db_table = 'my_students1' #这里的表名称一定要和数据库中表名保持一致
    
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
        age = models.IntegerField()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.建立测试文件

    在项目根目录下建立test测试py文件,将一下4行输入到文件

    import os
    import django
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_project.settings')
    django.setup(set_prefix=False)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.导入模型类

    import os
    import django
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_project.settings')
    django.setup(set_prefix=False)
    
    #这里app1是应用名称  models是模块文件名称  students1是我们创建的模型类
    from app1.models import students1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    5.查询集合all()

    import os
    import django
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_project.settings')
    django.setup(set_prefix=False)
    
    from app1.models import students1
    
    #students1.objects.all返回的是一个django封装的queryset集合。简单理解为一个集合就可以了。集合中就是每行的记录,也是"模型类的实例对象"。这样遍历就是遍历每个实例对象。这样就可以打印没条数据了
    list = students1.objects.all()
    for i in list:
        print(i.id,i.name,i.age)
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    运行此文件的结果是:

    E:\code\virtualenv\t1\Scripts\python.exe E:/code/python_project/t1/test.py 
    1 zhangsan 20
    2 lisi 20
    3 wangwu 21
    4 xiaohong 22
    5 xiaoming 23
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    6.集合过滤filter()

    filter的返回结果也是一个queryset集合

    list = students1.objects.filter(age=20)
    for i in list:
        print(i.id,i.name,i.age)
    
    • 1
    • 2
    • 3

    结果如下:

    E:\code\virtualenv\t1\Scripts\python.exe E:/code/python_project/t1/test.py 
    1 zhangsan 20
    2 lisi 20
    
    • 1
    • 2
    • 3
    6.1 大于查询__gt
    list = students1.objects.filter(age__gt=20)
    for i in list:
        print(i.id,i.name,i.age)
    
    
    • 1
    • 2
    • 3
    • 4
    6.2 小于查询__lt
    list = students1.objects.filter(age__lt=23)
    for i in list:
        print(i.id,i.name,i.age)
    
    
    • 1
    • 2
    • 3
    • 4
    6.3 模糊查询__contains
    list = students1.objects.filter(name__contains="xiao")
    for i in list:
        print(i.id,i.name,i.age)
    
    • 1
    • 2
    • 3

    7.get()

    get函数的结果必须是一个结果,要是两个结果都不可以用这个。get的返回结果是一个模型类实例对象。不是queryset集合

    list = students1.objects.get(id=1)
    print(list.id,list.name,list.age)
    
    • 1
    • 2

    8.取反exclude()

    list = students1.objects.exclude(age=20)
    for i in list:
        print(i.id,i.name,i.age)
    
    • 1
    • 2
    • 3

    结果如下:

    3 wangwu 21
    4 xiaohong 22
    5 xiaoming 23
    
    • 1
    • 2
    • 3

    9.Q查询

    q查询就是或关系查询

    from django.db.models import Q
    list = students1.objects.filter(Q(name="xiao") | Q(age=20))
    for i in list:
        print(i.id,i.name,i.age)
    
    • 1
    • 2
    • 3
    • 4

    模型类函数有很多,具体可以参照官网

    七、修改和删除

    1.修改update()

    list = students1.objects.filter(age=20)
    list.update(age=30)
    
    list = students1.objects.filter(age=30)
    for i in list:
        print(i.id,i.name,i.age)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.删除delete()

    例子1:
    list = students1.objects.filter(age=30)
    list.delete()
    
    
    例子2:
    list = students1.objects.get(name='wangwu')
    list.delete()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    八、一对多和多对多模型创建

    1.在my_publish表中插入数据

    MariaDB [data]> insert into my_publish values(0,'苹果出版社','北京',123),(0,'西瓜出版社','南京',456);
    MariaDB [data]> select * from my_publish;
    +----+-----------------+--------+-------+
    | id | name            | addr   | email |
    +----+-----------------+--------+-------+
    |  1 | 苹果出版社        | 北京   | 123    |
    |  2 | 西瓜出版社        | 南京   | 456    |
    +----+-----------------+--------+-------+
    2 rows in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.在my_book中插入数据

    在根目录下创建test.py文件。这里是一对多的数据插入

    import os
    import django
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_project.settings')
    django.setup(set_prefix=False)
    
    from app2.models import *
    
    #这里pk是自动指向my_publish的主键。pk是primary key的简写。在django中pk是固定写法
    publish_id = Publish.objects.get(pk=1)
    
    #这里要注意:publish字段是外键,自动关联了my_publish表得主键,插入数据的时候其实在sql中 直接插入my_publish表的主键值就可以了 。这里其实可以直接写出版的id值,但是#在这里没有这样写,这里是获取的这行的记录,把对象填写进去.这样的写的原始是可以直接使用publish字段获取出版社对象里的字段 
    Book.objects.create(title='西游记',price=199,publishDate='2022-01-01',publish=publish_id)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    数据如下:

    MariaDB [data]> select * from my_book;
    +----+-----------+--------+-------------+------------+
    | id | title     | price  | publishDate | publish_id |
    +----+-----------+--------+-------------+------------+
    |  1 | 西游记     | 199.00 | 2022-01-01  |          1 |
    +----+-----------+--------+-------------+------------+
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.多对多数据插入

    3.1 在my_author表中插入数据

    这里我们在用orm插入,在次练习一下orm

    author1 = Author.objects.create(name='鲁迅',age=101)
    author2 = Author.objects.create(name='老舍',age=202)
    
    • 1
    • 2
    3.2 在关系表中插入数据(add)

    因为多对多的关系是维护在第3张表中的,所有需要使用my_book类中得authors对象进行操作

    from app2.models import Book,Publish,Author
    
    #这里是必须使用get来获取模型类对象。获取book表中的某一个记录,然后使用这个记录在和my_author字段中建立关系
    book = Book.objects.get(pk=1)
    
    author_list = [1,2]
    #这里写了1和2 分别代码my_author表中的两行记录的主键ID。插入的结果是:my_book表中的记录分别和my_author的id为1和id为2的数据进行组合然后然后到book2author表中
    book.authors.add(*author_list)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    结果如下:

    MariaDB [data]> select * from book2author;
    +----+---------+-----------+
    | id | book_id | author_id |
    +----+---------+-----------+
    |  1 |       1 |         1 |
    |  2 |       1 |         2 |
    +----+---------+-----------+
    2 rows in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    3.3 移除数据(remove)
    book = Book.objects.get(pk=1)
    book.authors.remove(2)
    
    • 1
    • 2

    结果如下:

    MariaDB [data]> select * from book2author;
    +----+---------+-----------+
    | id | book_id | author_id |
    +----+---------+-----------+
    |  1 |       1 |         1 |
    +----+---------+-----------+
    1 row in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    3.4 清空(clear)
    MariaDB [data]> select * from book2author;
    +----+---------+-----------+
    | id | book_id | author_id |
    +----+---------+-----------+
    |  1 |       1 |         1 |
    |  3 |       1 |         2 |
    +----+---------+-----------+
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    这会清空book对象对应的所有关系
    book = Book.objects.get(pk=1)
    book.authors.clear()
    
    
    • 1
    • 2
    • 3
    • 4
    MariaDB [data]> select * from book2author;
    Empty set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    3.4 查询(all)

    这样我们就通过book对象查到了它在关系表中对应得所有author id

    book = Book.objects.get(pk=1)
    list = book.authors.all()
    
    for i in list:
        print(i.name,i.age)
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    Linux必会100个命令(五十三)dmesg命令
    随机森林算法
    音视频技术应用方向概述
    【华为机试真题 JAVA】字符串序列判定-100
    Split to Be Slim: 论文复现
    1. 前缀码判定
    王者荣耀游戏
    Java Double compare()方法具有什么功能呢?
    Spring5学习笔记05--BeanFactory后处理器
    RPC服务与HTTP服务的区别是什么
  • 原文地址:https://blog.csdn.net/smile_pbb/article/details/126432173