一、安装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)