django-ORM

一、安装django

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

查看是否安装成功

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

二、创建项目

#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.配置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.BASE_DIR:项目的绝对路径
2.DEBUG: 启动模式
	True: 调试模式
		检测代码改动后,立刻重启服务
	Fasle: 正式启动模式 / 上线模式3.ALLOWED_HOSTS: 允许访问本机的客户端主机,'*' 表示允许所有主机
4.DATABASES: 连接的数据库
5.LANGUAGE_CODE: 显示语言
	zh-Hans 表示用中文显示

2.安装mysqlclient

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

pip install mysqlclient

3.创建应用

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

python manage.py startapp app1

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应用
]

5.创建对应的数据库表

python manage.py migrate

6.启动django测试

python manage.py runserver

四、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

2.语法:

模型类名也就是表名

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

3.实例

3.1创建测试数据库
mysql> create database mydb1;
mysql> use mydb1
mysql> show tables;
Empty set (0.05 sec)
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()

解释:
class student是模型类 继承models.Model类
Meta: 是自定义生成的表名,如果不定义,表名就是"应用名" + "模型类"组合而成的表名
id,name,age 分别是表中的字段
3.3 开始创建表

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

python manage.py makemigrations
python manage.py migrate

3.4 验证

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

五、插入数据

1.方法1:

student.objects.create(id=1,name='zhangsan',age=20)

然后命令行执行
python manage.py migrate

2.方法2

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

六、查询数据

在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)


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()

3.建立测试文件

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

import os
import django

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_project.settings')
django.setup(set_prefix=False)

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

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)
    

运行此文件的结果是:

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

6.集合过滤filter()

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

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

结果如下:

E:\code\virtualenv\t1\Scripts\python.exe E:/code/python_project/t1/test.py 
1 zhangsan 20
2 lisi 20
6.1 大于查询__gt
list = students1.objects.filter(age__gt=20)
for i in list:
    print(i.id,i.name,i.age)

6.2 小于查询__lt
list = students1.objects.filter(age__lt=23)
for i in list:
    print(i.id,i.name,i.age)

6.3 模糊查询__contains
list = students1.objects.filter(name__contains="xiao")
for i in list:
    print(i.id,i.name,i.age)

7.get()

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

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

8.取反exclude()

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

结果如下:

3 wangwu 21
4 xiaohong 22
5 xiaoming 23

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.修改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)

2.删除delete()

例子1:
list = students1.objects.filter(age=30)
list.delete()


例子2:
list = students1.objects.get(name='wangwu')
list.delete()

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

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)

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)

数据如下:

MariaDB [data]> select * from my_book;
+----+-----------+--------+-------------+------------+
| id | title     | price  | publishDate | publish_id |
+----+-----------+--------+-------------+------------+
|  1 | 西游记     | 199.00 | 2022-01-01  |          1 |
+----+-----------+--------+-------------+------------+


3.多对多数据插入

3.1 在my_author表中插入数据

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

author1 = Author.objects.create(name='鲁迅',age=101)
author2 = Author.objects.create(name='老舍',age=202)
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)

结果如下:

MariaDB [data]> select * from book2author;
+----+---------+-----------+
| id | book_id | author_id |
+----+---------+-----------+
|  1 |       1 |         1 |
|  2 |       1 |         2 |
+----+---------+-----------+
2 rows in set (0.00 sec)

3.3 移除数据(remove)
book = Book.objects.get(pk=1)
book.authors.remove(2)

结果如下:

MariaDB [data]> select * from book2author;
+----+---------+-----------+
| id | book_id | author_id |
+----+---------+-----------+
|  1 |       1 |         1 |
+----+---------+-----------+
1 row in set (0.00 sec)

3.4 清空(clear)
MariaDB [data]> select * from book2author;
+----+---------+-----------+
| id | book_id | author_id |
+----+---------+-----------+
|  1 |       1 |         1 |
|  3 |       1 |         2 |
+----+---------+-----------+

这会清空book对象对应的所有关系
book = Book.objects.get(pk=1)
book.authors.clear()

MariaDB [data]> select * from book2author;
Empty set (0.00 sec)

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)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值