django-ORM模型
模型
模型是基于ORM设计思想
ORM (对象关系映射)
- 类与表的关系
- 对象与记录的关系
- 属性与字段的关系
模型类的定义
- 在 应用下的 models.py 文件中定义模型类
class Student(models.Model):pass
模型中常见的属性类型
CharField varchar
- EmailField varchar
FileField varchar
- ImageField varchar
TextField longtext
BinaryField longblob
IntegerField int
- BigIntegerField bigint
- SmallIntegerField smallint
AutoField int
FloatField float/double
DecimalField decimal
DateField date
DateTimeField datetime
TimeField time
BooleanField boolean
OneToOneField
ForeignKey
ManyToManyField
属性类 Field 中的属性
属性名 | 说明 | 默认值 |
---|---|---|
verbose_name | 属性的标签名、影响的是 admin站点网页 | None |
name | 设置属性名、name会修改属性的名称, 不常用 | None |
primary_key | 设置属性是否是主键、影响数据库 | False |
max_digits | 针对字符串、设置最大长度 | None |
unique | 设置属性是否唯一,影响数据库 | False |
blank | 设置属性是否为空、影响网页校验效果 | False |
null | 设置属性是否为空,影响的是数据库 | False |
default | 设置属性的默认值、影响数据库 | NOT_PROVIDED |
editable | 是否允许修改、影响网页 | True |
choices | 设置值的选项、对应一个下拉列表效果 | None |
help_text | 帮助文本、属性的提示信息、影响网页效果 | None |
db_column | 设置属性对应的数据库字段名、默认值和属性名保持一致 | 属性名 |
auto_created | 设置属性是否自动增长、一般配合主键使用 | False |
validators | 设置属性的校验规则 | None |
error_messages | 校验失败的提示信息 | None |
FileField 特有的属性
属性名 | 属性描述 | 默认值 |
---|---|---|
upload_to | 设置文件上传的存储位置 | 空字符串 |
storage | 设置上传文件的存储引擎 | None |
DecimalField 特有的属性
属性名 | 属性描述 | 默认值 |
---|---|---|
max_digits | 最大有效数字的位数 | None |
decimal_places | 小数点后保留几位小数 | None |
DateField 特有的属性
属性名 | 属性描述 | 默认值 |
---|---|---|
auto_now | 设置是否采用当前系统时间作为属性的值 | False |
关系属性类 常见的属性
属性名 | 属性描述 | 默认值 | 是否必传 | 备注 |
---|---|---|---|---|
to | 设置关系属性指向的模型类、如果指向自己,使用 “self” | Y | ||
on_delete | 指定当删除数据的时候,时候级联删除父数据 |
models.DO_NOTHING models.CASCADE |
Y | |
null | 是否允许为空 | N | 推荐使用 null=True | |
blank | 页面是否必传 | N | 推荐使用 blank=True | |
related_name | 在关系方维护自己的属性 | N |
模型类的完整定义
class Student(models.Model):"""一个模型类、对应数据库的一张表, 表名 默认是 应用名_模型名django中的模型 会自动生成一个 主键 且 属性名为 id,如果模型中自己定义了主键、则 django 不在自动生成 id主键"""name = models.CharField(max_length=100, verbose_name="学生名", blank=False, null=True)# choices 是一个 二维元组, ('m', '男') ==> 数据库存放的是 m , 页面显示的是 男# choices 对应页面的下拉列表 <select> <option value="m">男</option><option value="f">女</option></select>sex = models.CharField(max_length=1, verbose_name="性别", default="m", choices=(("m", "男"), ("f", "女")))birth = models.DateField(verbose_name="出生日期", null=True, blank=True, db_column="birthday")tel = models.CharField(max_length=11, verbose_name="手机号", null=True, blank=True)email = models.EmailField(verbose_name="邮箱", null=True, blank=True)# auto_now 如果为 true, 新增、修改 都会改变这个值并且取当前系统时间, 默认值default 只影响插入create_time = models.DateTimeField(default=timezone.now, verbose_name="入学时间")score = models.FloatField(null=True, blank=True)class Meta:# 指定模型类对应的表名,默认是应用名_模型名db_table = "t_student"
django数据迁移 (通过模型自动生成对应的表)
- 检查应用下的模型是否 存在异常
python manage.py check appName
- 生成建表需要的迁移文件
python manage.py makemigrations appName
- 查看迁移文件对应的 SQL语句
python manage.py sqlmigrate appName 迁移文件的编号
- 执行迁移文件、维护相关的表
# 生成django项目所有的应用下的所有模型对应的表
python manage.py migrate # 只执行 appName 应用下的迁移文件
python manage.py migrate appName
django shell
python manage.py shell
模型 - 数据新增
- 方式一:
from user.models import Studentstu = Student(name='xxxx', sex='f', ....)stu.save()
- 方式二:
# 返回一个模型管理器
manage = Student.objects
stu = manage.create(name=xxxx, sex="", ...)============================================stu = Student.objects.create(...)
模型 - 数据的修改
- 方式一 :
stu = Student(id=1, name="xxx", sex="f")
stu.save()===============================================================stu = Student.objects.get(pk=1)
stu.name = 'xxx'
stu.sex = 'f'
stu.save()
PS: save方法可以实现数据的新增和修改、如果 主键不存在 或者 主键存在,但数据库中找不到对应的记录,则 新增, 否则 修改
save 方法在做数据修改的时候,采用的是 表中全字段修改
- 方式二:
queryset = Student.objects.filter(pk=1)queryset.update(name='xxx', sex='xxx')
模型-数据的删除
- 模型对象 调用 delete 删除数据
Student.objects.get(pk=1).delete()
- queryset 对象调用 delete 删除数据
Student.objects.filter(pk=1).delete()
模型-数据的查询
- 模型管理器 Model.objects
模型管理器/QuerySet 常见的方法
- get()
- filter() : 相当于 where
- exclude() : 相当于 not filter
- all()
- values()
- order_by()
- first()
- last()
- count()
- distinct()
get([条件]) 方法
- 获取有且只有一条数据、返回 模型对象
Student.objects.get() : 如果表中查过一条、则抛出 MultipleObjectsReturned
如果表中没有数据、则抛出DoesNotExist
filter([条件]) 方法
- 对表中的数据进行筛选过滤、相当于数据库中的 where, filter 返回 QuerySet 对象
Student.objects.filter(pk=1)--
select * from t_student where id = 1
exclude([条件]) 方法
- 对表中的数据进行筛选过滤、排除满足条件的数组、返回 QuerySet对象
Student.objects.exclude(pk=1)-- 相当于 mysql
select * from t_student where id != 1
all() 方法
- 查询所有数据、返回QuerySet 对象
Student.objects.all()
values(prop…) 方法
- values 查询到的数据、返回 QuerySet对象
- values 查询到的每一条记录,是一个字典格式的数据
- values 可以查询部分属性
Student.objects.values("id", "name")
order_by(prop…) 方法
- 对查询的结果进行排序
- 多个排序用逗号分割
- 默认采用升序排列,如果要使用降序排列,在 属性的前面加
-
即可
-- 按照 name 升序排列
Student.objects.order_by("name")-- 按照 name 降序排列
Student.objects.order_by("-name")
distinct() 去重
- 配合value方法,对查询到数据进行去重
Student.objects.values("sex").distinct()
查询条件
- 关系条件查询
- 逻辑条件查询
- 模糊查询
- 区间查询
- 枚举查询
- 空值查询
- 日期查询
关系条件查询
- __gt= 大于
- __gte= 大于等于
- __lt= 小于
- __lte= 小于等于
- = 等于
- __exact= 等于
- __iexact= 等于(忽略大小写)
# 查询成绩大于 50分 的学生select * from t_student where score > 50 ;Student.objects.filter(score__gt=50)
逻辑条件查询
# 查询成绩 大于 50 且 性别为 男的所有学生 select * from t_student where score > 50 and sex = 'm'Student.objects.filter(score__gt=50, sex='m')-- 使用 Q 查询、完成 and 逻辑与from django.db.models import QStudent.objects.filter(Q(score__gt=50) & Q(sex='m') )# 查询 成绩大于 50 或者 性别为 男 的学生select * from t_student where score > 50 or sex = 'm'Student.objects.filter( Q(score__gt=50) | Q(sex__exact='m') )
模糊查询
__startswith= 以 … 开头
__endswith= 以 … 结尾
__contains= 包含…
__istartswith= 以 … 开头,忽略大小写
__iendswith= 以 … 结尾,忽略大小写
__icontains= 包含…,忽略大小写
# 查询 名字包含 a 的所有学生 select * from t_student where name like '%a%'Student.objects.filter(name__contains="a")
区间查询
- __range=(min, max)
# 查询 成绩在 60 -80 之间的所有学生select * from t_student where score between 60 and 80 ;Student.objects.filter(score__range=(60, 80))
枚举查询
- __in=(val, …)
查询 id 为 1,3 ,5 的所有学生 select * from t_student where id in (1, 3, 5)Student.objects.filter(pk__in=(1,3,5))
空值查询
- __isnull=True/False
查询 生日 为空的学生信息select * from t_student where birthday is null ;Student.objects.filter(birth__isnull=True)
日期条件查询
- __date= : 根据日期查询
- __year= : 根据年份查询
- __month= : 根据月份查询
- __day= : 根据 天查询
- __hour= : 根据小时查询
- __minute= 根据分钟查询
- __second= 根据秒查询
Student.objects.filter(create_time__date="2020-09-10")
F 对象
- 对模型属性的引用
-- 将ID=1 的学生成绩增加 40 分Student.objects.filter(pk=1).update(score= F("score") + 40)
- 控制排序
-- 按照成绩升序排列、没有成绩的显示在末尾Student.objects.order_by(F("score").asc(nulls_last=True))
F 对象中,有 asc 和 desc 两个方法实现 基于某个属性的排序
asc , desc 两个函数都可以 设置两个属性
nulls_last : 空值是否显示在最后
nulls_first: 空值是否现在在前面
annotate 配合 values 完成分组效果
from django.db.models import Sum. Avg, Max, Min , Count-- 查询男生、女生对应的人数 Student.objects.values("sex").annotate(count=Count("sex"))
aggregate 聚合操作
-- 查询学生中成绩最高的分数Student.objects.aggregate(max=Max("score"))
Func 对象
from django.db.models import FuncStudent.objects.values("name", md5=Func(F("name"), function="md5"))
---
select name, md5(name) as md5 from t_student from django.db.models import ValueStudent.objects.create(name=Func(Value("abc"), function="md5"), sex="m")Student.objects.values(namex = Func(F("name"), 1 , 2 , function="substring"))
Django 内置的 User 模型
from django.contrib.auth.models import User
User模型常见的属性
- username : 用户名
- password : 密码,采用了加密技术
- last_login : 最近登录的时间
- is_superuser : 是否是超级用户
- first_name : 名
- last_name : 姓
- email : 邮箱
- is_staff : 是否允许进入后台 admin 站点
- is_active : 是否激活
- date_joined : 用户的注册时间
User模型对应的管理器常见的方法
- create_user(username, password, email, **extra_fields) : 创建一个普通用户、密码自动加密、并返回 user对象
- create_superuser() : 创建一个超级用户、密码自动加密
- set_password() : 将明文密码 设置成密码,并赋值 给 user的 password 属性
- check_password() : 校验密码
自定义模型管理器
class StudentManage(models.Manage):def create_stu(**kwargs):model = self.model(**kwargs)model.save()return model ;class Student(models.Model):...objects = StudentManage()
解决模型录入时间差8小时问题
LANGUAGE_CODE = 'zh-hans'TIME_ZONE = 'Asia/Shanghai'USE_I18N = TrueUSE_L10N = TrueUSE_TZ = False
模型的逆向工程
- 通过 表 创建 模型
python manage.py inspectdb 表
django-ORM模型相关推荐
- django 日志写入mysql_如何将django orm模型 写入数据库
1.指定连接pymysql(python3.x) 先配置_init_.py import pymysql pymysql.install_as_MySQLdb() 2.配置连接mysql文件信息 se ...
- Django框架(3.django设计模型类、模型类生成表、ORM框架简介)
ORM框架简介 O是object,也就类对象的意思, R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思, M是mapping,是映射的意思.在ORM框架中,它帮我们把类和数据表进 ...
- Django从理论到实战(part27)--ORM模型的增删改查操作
学习笔记,仅供参考 参考自:Django打造大型企业官网–Huang Y: 本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列 ...
- Django从理论到实战(part26)--ORM模型
学习笔记,仅供参考 参考自:Django打造大型企业官网–Huang Y: 本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列 ...
- Django笔记:ORM模型
Django中操作数据库的方式有两种,一种是使用ORM模型,另一种是直接执行SQL,推荐使用ORM模型的方式来管理数据库,因为当需要执行的数据库操作过多时,第二种方式产生的SQL会非常难于管理和维护, ...
- Django 第十课 1.【ORM模型】
ORM模型介绍 随着项目的越来越大,采用写原生SQL的方式在代码中会出现大量的SQL语句,那么问题就出现了: 1:SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长.会出现很多相近的SQL ...
- django orm原理_django 动态创建一个模型的多个table name, 并通过 Django ORM 操作
动态创建table, 并通过 Django ORM 操作. 动态的创建表 动态的创建模型其实就是在运行时生成 Model 类, 这个可以通过函数实现, 通过传参(今天的日期, 如: 20181211) ...
- 六、Django ORM关联模型
本章节将介绍ORM中的关联模型,以下测试基于book管理 一.创建关联模型 创建app01并注册 编辑全局settings.py文件,如下: INSTALLED_APPS = ['django.con ...
- Django数据库ORM模型使用(数据查询)!!!Django数据库如何使用ORM模型查询数据? ✧*。٩(ˊᗜˋ*)و✧*。 Django初体验
文章目录 查询方法 查看执行的SQL语句 查询条件 精准与模糊查询 比较条件 时间条件 聚合函数 Avg:求平均值. Count:获取指定的对象的个数. Max和Min:获取指定对象的最大值和最小值. ...
- Python全栈:Django中的ORM模型
文章目录 1 Django中的ORM模型介绍及配置 2 Django中的ORM模型常见字段类型 CharField DateTimeField 模型的创建 3 Django中的ORM模型同步 migr ...
最新文章
- python编程经典案例-一个非常适合Python新手的编程案例——投票小程序
- POJ2135 来回最短路(简单费用流)
- allegropcb怎么导出成cad_私藏技巧分享!CAD中的表格坐标快速输出成Excel!
- CSS样式表——超链接样式
- 重载赋值运算符含动态申请
- 数学建模3 论文排版注意点
- 信息学奥赛一本通C++语言——1100:金币
- 从职业方向,谈程序员如何突破成长瓶疾,我们该怎么去学习?
- 虚拟机全知道_12个使用技巧
- 大型网站技术架构(读书笔记)
- UVA12039 Goldbach‘s Cardinality【欧拉筛法】
- 贺利坚老师汇编课程21笔记:用汇编语言写的源程序
- Win10——使用WePE工具U盘重装系统
- 发力“创新宇宙”,酒店集团如何破局商业革新?
- python不知道吃什么_一个人不知道吃什么?找出我做的一个人的食物
- 荣耀智慧屏x1鸿蒙2.0功能,让家庭中心回归客厅-荣耀智慧屏X1评测
- 满减活动基础算法-java-类似淘宝满200减30
- OC block的回环引用
- 有什么可以赚钱的副业?日入300元就靠这几个副业!
- 学习笔记:光电耦合器PC817
热门文章
- 项目上诸葛IO的使用
- nginx文件服务器中文路径,nginx配置文件支持中文路径.htm
- android ios 录音 sdk,集成SDK(iOS)
- rust怎么建莲花房_《Rust》生存指南及房屋建造攻略
- simufact 感应淬火模拟
- 男人的痛女人永远不知道!
- 百事元宇宙发布会震撼开场,虚拟发布会打开品牌线上活动策划新思路
- 安卓平板 电脑模式_Windows 10中的平板电脑模式是什么以及如何打开和关闭它
- 线索化二叉树,中序建立线索,带线索中序遍历,删除,c/c++描述
- App提交到App Store时警告:WARNING ITMS-90737