django之mysql数据库的配置和orm交互
一:django默认数据库的配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
二:自定义数据库的配置
1. 安装mysql驱动 install PyMySQL
2. setting.py中修改 DATABASES中的配置。
# ———————————————————mysql数据库的设置——————————————————— DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': "django_study_test", # 迁移是生成数据库的名称 'HOST':"127.0.0.1", 'PORT':3306, 'USER':"xx", 'PASSWORD':"xx", } } # ———————————————————mysql数据库的设置———————————————————
3.工程目录下的__init__.py中设置。
from pymysql import install_as_MySQLdb install_as_MySQLdb()
作用是让Django的ORM能以mysqldb的方式来调用PyMySQL。
4. 在应用中的model.py中定义模型类
from django.db import models # Create your models here. class Country(models.Model): # 没有定义主键,迁移生成建表语句是,会自动增加id这个字段。 country_name = models.CharField(max_length=20,verbose_name="国家名称") build_time = models.DateField(verbose_name="创建时间") country_flower = models.CharField(max_length=20,verbose_name="国花") province_number = models.IntegerField(verbose_name="行政区的数量") is_unite_member = models.BooleanField(default=False,verbose_name="联合国五常") class META: # 正确的写法是 class Meta,就相当于没有找到这个抽象的类,所以使用了默认的表名。 db_table = "tb_country" # 设置这个值,不起作用,表的名字还是默认的user_country app的小写_模型类的名字小写为表的名字。 def __str__(self): return self.country_name class Province(models.Model): province_name = models.CharField(max_length=20,verbose_name="行政区的名字") nick_name = models.CharField(max_length=20,verbose_name="别称") famous_school = models.CharField(max_length=20,verbose_name="高等院校") count_985211 = models.IntegerField(verbose_name="985/211的数量") belong = models.ForeignKey("Country",on_delete=models.CASCADE,verbose_name="所属国家") # 迁移建表时候,会自动关联 country的主键。 class META: db_table = "tb_province" def __str__(self): return self.province_name
5. shell 中输入迁移指令
python manage.py makemigrations
python manage.py migrate
![](https://img2018.cnblogs.com/blog/1749518/201910/1749518-20191031143133373-240858942.png)
生成了一大堆其他的表,作用是什么?
6. 查看数据库中表的情况
数据库
![](https://img2018.cnblogs.com/blog/1749518/201910/1749518-20191031143332780-142020172.png)
7.插入数据
文件插入数据
![](https://img2018.cnblogs.com/blog/1749518/201910/1749518-20191031143422547-1856311249.png)
![](https://img2018.cnblogs.com/blog/1749518/201910/1749518-20191031143609616-204195251.png)
insert into user_country values (1,"中国","1949-10-01","牡丹",32,1),(2,"日本","1949-12-23","樱花",32,1),(3,"韩国","1949-10-01","木槿花",32,1);
insert into user_province values (1,"北京","京城","清华大学",20,1),(2,"上海","魔都","复旦大学",20,1),(3,"广州","粤城","华南理工大学",20,1),(4,"东京","首都","东京大学",20,2),(5,"首尔","泡菜","首尔大学",20,3);
注意:使用的django中的shell工具记性orm的测试
8.增
方法一:
![](https://img2018.cnblogs.com/blog/1749518/201910/1749518-20191031150834013-1178824033.png)
![](https://img2018.cnblogs.com/blog/1749518/201910/1749518-20191031150755763-827966803.png)
方法二:
![](https://img2018.cnblogs.com/blog/1749518/201910/1749518-20191031151530452-958686356.png)
![](https://img2018.cnblogs.com/blog/1749518/201910/1749518-20191031151551159-1973710550.png)
9.查
查询所有
类名.objects.all()
![](https://img2018.cnblogs.com/blog/1749518/201910/1749518-20191031154513626-1191514062.png)
一对多查询
![](https://img2018.cnblogs.com/blog/1749518/201910/1749518-20191031154628231-542863600.png)
多对一查询
![](https://img2018.cnblogs.com/blog/1749518/201910/1749518-20191031154834518-175474503.png)
条件查询
filter 过滤多个结果
get 过滤单一结果
exlcude 排除掉符合条件后剩下的结果
属性名称__比较运算符=值
条件查询之模糊查询
包含查询 contains 包含
![](https://img2018.cnblogs.com/blog/1749518/201911/1749518-20191101090441326-2127754571.png)
结尾开头查询 startswith endswith
![](https://img2018.cnblogs.com/blog/1749518/201911/1749518-20191101090448789-156218670.png)
空查询 isnull
![](https://img2018.cnblogs.com/blog/1749518/201911/1749518-20191101090705895-1786494569.png)
范围查询 in=[] in=() 指的是在括号里面出现的范围,不是betwwen的意思。不是从32到100的意思,而是32或100的意思。
![](https://img2018.cnblogs.com/blog/1749518/201911/1749518-20191101091322890-806917673.png)
比较查询
gt 大于 gte 大于等于 lt 小于 lte 小于等于
![](https://img2018.cnblogs.com/blog/1749518/201911/1749518-20191101091614700-1178152024.png)
不等于 需要使用 exclude过滤器
![](https://img2018.cnblogs.com/blog/1749518/201911/1749518-20191101091829965-1781418054.png)
时间查询 from datetime import date
![](https://img2018.cnblogs.com/blog/1749518/201911/1749518-20191101092218068-843634596.png)
F对象
用于属性值,用于两个属性之间的数值比较:由于没有其他的int类型字段了,因此从别人的例子中贴图
# 不同属性之间进行比较
Q 对象
多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。
# 表示逻辑
聚合函数
Avg Count Max Min Sum
# 总数
aggregate进行连接
Count不用 aggregate进行连接
Avg 平均
Max
排序
# 升序
![](https://img2018.cnblogs.com/blog/1749518/201911/1749518-20191101095021707-1165524654.png)
# 降序
关联查询
# 一到多的查询
# 多到一的查询
关联过滤查询
# 一对多的关联查询
# 过滤 多的一方的类名小写__多的一方的字段名+条件
# 多对一的关联查询
多的一方的外键__一的一方的字段名+条件
10 改
# 修改字段值
方法一: obj.字段名 = 新值 obj.save()
方法二: 模型类.objects.filter(字段原值).update(要改的值) 返回受影响的行数
批量修改
# 批量修改
# 修改前
# 修改中
# 修改后
11.删除
# 删除的两种方式