1. 数据库配置
Django的Model(数据库模型) 是基于ORM(object relation mapping 对象关系映射表模式来操作的。
数据库用户的创建和授权及表使用步骤
解释器链接的是虚拟机中的Mysql数据库。
一般情况下,虚拟机中的mysql root账户不拿来操作表,我们需要自己创建一个账户并授权来操作我们的表。
步骤1:创建数据库用户(授权)
- 创建新的数据库并指明字符串编码
create database Test charset=utf8;
- 创建用户名test的数据库用户,并将Test下面的所有表授权给用户,支持远程访问
必须在虚拟机里面的root账户里面授权
grant all privileges on mydjango.* to '账户'@'%'(本地%为local) identified by '密码';
刷新权限
flush privileges;
- 数据库进入命名
mysql -u用户名 -p密码 -A 数据库名
步骤2:配置MYSQL数据库信息
①、setting里面 将原始的DATABASE注释掉然后添加新的
DATABASE = {
'default':{
'ENGINE':'django.db.backends.mysql',
'NAME':'创建的数据库名', #要存储数据的数据库名
'USER':'mysql用户名', #数据库的用户名
'PASSWORD':'mysql密码', #数据库的密码
'HOST':'ip地址', #链接的数据库ip地址
'PORT':'3306', #数据库端口
}
}
②、在大项目项目文件夹里面的__init__.py里面添加两句代码
# 需要在虚拟机我们存放项目的虚拟环境里面导入pymysql模块才能使用。添加后重启下项目。
import pymysql
pymsql.install_as_MySQLdb()
步骤3:在子项目里面的models.py里面创建类
from django import models
# 类名就是数据库中的表名
class TABLE_name(models.Model): #一定要继承models.Model 创建表
#创建字段
name = models.CharField(max_lenght=20) # 字符串 必须设置字符串长度
price = models.FloatField()
pub_date = models.DateField()
def __str__(self):
return self.name #在打印时调用__str__魔术方法,打印出name
步骤4:数据迁移
在terminal环境下运行数据库:
-- python manage.py migrations [数据表名] # 如果没有加数据表名就会创建所有表,若加了则创建指定表
-- python manage.py migrate [数据表名] # 如果没有加数据表名就会迁移所有表,若加了则迁移指定表
在配置好前面两步后,后续操作就是在第3步和第4步之间来回操作。当我们创建的模型类中的字段有修改时都需要进行数据迁移才能实效。
即修改模型三部曲:
1. 修改模型(创建模型)
2. 运行`python manage.py makemigrations`创建迁移
3. 运行`python manage.py migrate`迁移生效
2. 常用字段方法
方法 返回数据类型 作用
模型类.objects.all() QuerySet 返回表中所有数据
模型类.objects.filter(xx) QuerySet 返回符合条件的数据
模型类.objects.exclude(xx="") QuerySet 返回不符合条件的数据
模型类.objects.order_by("") QuerySet 对查询结果集进行排序 -为反序,不加-为正序 #里面要对字段用""包起来才行
模型类.objects.values() QuerySet 返回一个QuerySet 每个元素为一个字典
模型类.objects.order_by("").reverse() QuerySet 对排序的结果反转 #结合order_by来使用
模型类.objects.get() 模型对象 返回一个满足条件的对象;
如果没有找到符合条件的对象,会引发 模型类.DoesNotExist异常;
如果找到多个,会引发模型类.MultiObjectsReturned 异常
模型类.objects.count() int 返回查询集中对象的数目
模型类.objects.first() 模型对象 返回第一条数据
模型类.objects.last() 模型对象 返回最后一条数据
模型类.objects.exists() bool 判断查询的数据是否存在
模型类.object.values_list("x","xx") QuerySet 返回一个QuerySet 每个元素为一个元组
模型类.objects.only("") QuerySet 返回一个QuerySet 每个元素为一个对象,同时其他字段也能拿到
模型类.objects.defer("") QuerySet 返回一个QuerySet 返回不符合条件的字段
and 模型类.objects.filter(条件1,条件2) QuerySet 返回一个QuerySet 每个元素为一个对象
or 需要导入 from django.db.models import Q
模型类.objects.filter(Q(条件1)|Q(条件2)) QuerySet 返回一个QuerySet 每个元素为一个对象
查询条件
模型类.objects.filter(字段名__exact = "") 准确匹配,区分大小写
模型类.objects.filter(字段名__iexact = "") 匹配,不区分大小写
模型类.objects.filter(字段名__contans = "x") 字段名里面包含x的都匹配,区分大小写
模型类.objects.filter(字段名__icontans = "x")字段名里面包含x的都匹配,不区分大小写
模型类.objects.filter(字段名__in = [[],""]) 指定值查询,可以使列表,可以是字符串,也可以是元组
模型类.objects.filter(字段名__gt = "") 大于该数值的数据
模型类.objects.filter(字段名__gte = "") 大于等于该数值的数据
模型类.objects.filter(字段名__lt = "") 小于该数值的数据
模型类.objects.filter(字段名__lte = "") 小于等于该数值的数据
模型类.objects.filter(字段名__range =(a,b)) 在这个范围内的数据
聚合函数和分组
from django.db.models import Count,Avg,Max,Min
模型类.objects.value("字段名A").annotate(新名字=聚合函数名("字段名A"))
__双下划线模糊查询
3. 单表操作
示例模型类: