Python全栈:Django中的ORM模型
文章目录
- 1 Django中的ORM模型介绍及配置
- 2 Django中的ORM模型常见字段类型
- CharField
- DateTimeField
- 模型的创建
- 3 Django中的ORM模型同步 migrate
- 实现模型同步
- 新增字段
- 原理解析
- 4 Django中的ORM模型的元数据
- 元数据的描述
- 5 Django中的ORM模型外键关联类型
- 6 Django中的ORM模型复合类型
1 Django中的ORM模型介绍及配置
Django ORM支持的数据库:
- MySQL
- MariaDB
- SQLite
- PostgreSQL
- ORACLE
与Flask的区别:
- Django自带ORM
- Flask需要使用扩展(SQLAlchemy只是其中一个)
Django ORM配置:
项目配置(setting.py)
安装依赖
- pip install mysqlclient
配置示例:
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'test_django','USER': 'root','PASSWORD': '','HOST': '127.0.0.1','PORT': '3306',} }
- NAME——数据库名称
- USER——数据库登录用户名
- PASSWORD——数据库登录密码
- HOST——数据库访问地址
- PORT——数据库访问端口
sqlite3的配置选项
只需要指定数据库引擎和数据库文件名称即可
DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': os.path.join(BASE_DIR, 'db.sqlite3'),} }
2 Django中的ORM模型常见字段类型
模型代码:
示例:
class User(models.Model):""" 用户模型 """name = models.CharField('姓名', max_length=64)age = models.PositiveIntegerField('年龄', default=0)
文本:
- CharField、TextField——字符串、文本
- FileField、ImageField——文件、图片
- FilePathField——文件路径
- EmailField——邮件地址
- URLField——URL地址
数字(整数)
- IntegerField——整数
- SmallIntegerField——整数
- BigIntegerField——整数
- BooleanField——布尔值(1,0)
- PositiveIntegerField——正整数
- FloatField、DecimalField——小数
日期和时间:
- DateField——日期
- TimeField——时间
- DateTimeField——日期时间
特殊类型:
- OneToOneField——一对一关联
- ForeignKey——外键关联
- ManyToManyField——多对多关联
- GenericForeignKey——复合关联
模型基类
- django.db.models.Field
类型的选项(可选参数)
每个类型都有可选参数,部分类型有必传参数
参数传递是无序的(需要写参数的名称)
一般情况下,第一个参数不指定名称
verbose_name
- 大多数模型类型的第一个参数
- 特例:ForeignKey、ManyToManyField、OneToOneField
- 方便阅读,即:该字段的含义
null、blank——是否为Null、空值
db_column——数据库表中对应的字段名称
default——不填写改字段值时的默认值
primary_key、unique——主键、唯一索引
help_text——帮助文字
choices——可供选择的选项,如:性别的选项(男,女)
sex = models.CharFiled('性别', max_length=1, choices=(('1','男'),('2','女') ))
get_FOO_display()——展示choices对应的值
CharField
- max_length——最大长度
- 相关类型
- EMailField——邮件输入
- URLField——URL输入
DateTimeField
- auto_now——更新时间为记录更改时的时间
- auto_now_add——记录创建的时间
注意两者之间的区别
模型的创建
- 创建模块
python manage.py startapp accounts
- 编写模型代码
from django.db import models# Create your models here.class User(models.Model):""" 用户模型 """name = models.CharField('姓名', max_length=64)sex = models.CharField('性别', max_length=1, choices=(('1','帅哥'),('0','美女'),),default='1')age = models.PositiveIntegerField('年龄', default=0)username = models.CharField('用户名', max_length=64, unique=True)password = models.CharField('密码', max_length=256)remark = models.CharField('备注', max_length=64, null=True, blank=True)created_at = models.DateTimeField('注册时间', auto_now_add=True)updated_at = models.DateTimeField('最后修改时间', auto_now=True)
3 Django中的ORM模型同步 migrate
实现模型同步
前提:确认settings.py
- 已将模型添加到 INSTALLED_APPS
- 数据库配置:
步骤一:检查模型是否编写正确
python manage.py check
- 步骤二:使用makemigrations生成同步原语
python manage.py makemigrations
- 步骤三:使用migrate执行同步
python manage.py migrate
表结构:
新增字段
如果我要在accounts_user
表中新增字段
email = models.EmailField('用户邮箱', max_length=64, null=True, blank=True)
重复以上三个步骤即可:
原理解析
- 先生成同步原语
- 再按顺序执行
4 Django中的ORM模型的元数据
元数据的描述
使用Meta类来表示
对模型的补充说明
示例:
class Meta:verbose_name = '用户基础信息'verbose_name_plural = '用户基础信息'db_table = 'oauth_user'
db_table——模型映射的数据库表的名称
ordering——指定数据表的默认排序规则
verbose_name——供编程查看的字段名称(便于阅读)
修改models.py
重新生成:
查看数据库:
abstract——抽象类
- 抽象类不会生成数据库表
from django.db import models# Create your models here. class CommonModel(models.Model):""" 自定义模型的基类 """created_at = models.DateTimeField('注册时间', auto_now_add=True)updated_at = models.DateTimeField('最后修改时间', auto_now=True)class Meta:abstract = Trueclass User(CommonModel):""" 用户模型 """name = models.CharField('姓名', max_length=64)sex = models.CharField('性别', max_length=1, choices=(('1','帅哥'),('0','美女'),),default='1')age = models.PositiveIntegerField('年龄', default=0)username = models.CharField('用户名', max_length=64, unique=True)password = models.CharField('密码', max_length=256)remark = models.CharField('备注', max_length=64, null=True, blank=True)email = models.EmailField('用户邮箱', max_length=64, null=True, blank=True)class Meta:db_table = 'user'class Profile(CommonModel):""" 用户详细信息 """nickname = models.CharField('昵称', max_length=64)
查看数据库:
- proxy——代理模型(对父模型的功能进行扩充)
class User(CommonModel):""" 用户模型 """name = models.CharField('姓名', max_length=64)sex = models.CharField('性别', max_length=1, choices=(('1','帅哥'),('0','美女'),),default='1')age = models.PositiveIntegerField('年龄', default=0)username = models.CharField('用户名', max_length=64, unique=True)password = models.CharField('密码', max_length=256)remark = models.CharField('备注', max_length=64, null=True, blank=True)email = models.EmailField('用户邮箱', max_length=64, null=True, blank=True)class Meta:db_table = 'user'def xxx1(self):passclass Manager(User):class Meta:proxy = Truedef xxx2(self):pass
元数据的设置使ORM的模型的功能更加强大
5 Django中的ORM模型外键关联类型
数据库中有哪些关联关系?
一对一
OneToOneField(to, on_delete, parent_link=False,**options)
- 举例:用户信息进行分表
一对多
ForeignKey(to, on_delete, **options)
- 举例:用户提问
多对多
ManyToManyField(to, **options)
- 举例:收藏问题
to——关联的模型(必传)
- 模型类
- 模型类(字符串)
- self
on_delete——删除选项(必传)
- CASCADE:关联删除
- PROTECT:受保护,不允许被删除
- SET_NULL:设置为None,需要添加选项null=True
- SET_DEFAULT:设置为默认值,需要添加选项default
- SET():传参设置值
- DO_NOTHING:什么也不做
related_name
- 是否需要反向引用,反向引用的名称
related_query_name
- 反向引用的名称
class Profile(CommonModel):""" 用户详细信息 """user = models.OneToOneField('User', on_delete=models.CASCADE,related_name='profile')nickname = models.CharField('昵称', max_length=64)
修改列名:
class User(CommonModel):""" 用户模型 """name = models.CharField('姓名', max_length=64)sex = models.CharField('性别', max_length=1, choices=(('1','帅哥'),('0','美女'),),default='1')age = models.PositiveIntegerField('年龄', default=0)username = models.CharField('用户名', max_length=64, unique=True)password = models.CharField('密码', max_length=256)remark = models.CharField('备注', max_length=64, null=True, blank=True)email = models.EmailField('用户邮箱', max_length=64, null=True, blank=True)collect_ques = models.ManyToManyField('Questoin')class Meta:db_table = 'user'def xxx1(self):passclass Questoin(CommonModel):""" 问题 """name = models.CharField('问题名称', max_length=64)class Answer(CommonModel):""" 答案 """question = models.ForeignKey(Questoin, on_delete=models.CASCADE,related_name='answers',verbose_name='关联的问题')content = models.TextField('答案的内容', max_length=64)class Classify(models.Model):""" 分类酒水啤酒白酒"""name = models.CharField('名称', max_length=64)parent = models.ForeignKey('self', related_name='children',on_delete=models.CASCADE)
6 Django中的ORM模型复合类型
- 新建模块,编写内容
from django.db import models# Create your models here.class Sight(models.Model):""" 景点表 """name = models.CharField('景点名称', max_length=64)address = models.CharField('景点地址', max_length=64)class Order(models.Model):""" 订单表 """sn = models.CharField('订单号', max_length=64)amount = models.FloatField('订单金额')class SightComment(models.Model):""" 景点评论 """content = models.CharField('评论内容', max_length=512)score = models.FloatField('分数', default=5)class OrderComment(models.Model):""" 订单评论 """content = models.CharField('评论内容', max_length=512)score = models.FloatField('分数', default=5)
- ContentType——内容模型
- ForeignKey(ContentType)——关联复合模型
- GenericForeignKey——关联模型
- GenericRelation——反向关联
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
from django.contrib.contenttypes.models import ContentType
from django.db import models# Create your models here.class Sight(models.Model):""" 景点表 """name = models.CharField('景点名称', max_length=64)address = models.CharField('景点地址', max_length=64)class Order(models.Model):""" 订单表 """# order = Order()# order.commentssn = models.CharField('订单号', max_length=64)amount = models.FloatField('订单金额')comments = GenericRelation('Comment', related_query_name='order_comments')class SightComment(models.Model):""" 景点评论 """content = models.CharField('评论内容', max_length=512)score = models.FloatField('分数', default=5)class OrderComment(models.Model):""" 订单评论 """content = models.CharField('评论内容', max_length=512)score = models.FloatField('分数', default=5)# class Comment(models.Model):
# """ 所有评论 """
# sight = models.ForeignKey(Sight, null=True)
# order = models.ForeignKey(Order)
# content = models.CharField('评论内容', max_length=512)
# score = models.FloatField('分数', default=5)class Comment(models.Model):""" 所有评论 """# comment = Comment()# comment.order# comment.sight# comment.content_objectcontent_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)object_id = models.PositiveIntegerField()content_object = GenericForeignKey('content_type','object_id')content = models.CharField('评论内容', max_length=512)score = models.FloatField('分数', default=5)
Python全栈:Django中的ORM模型相关推荐
- 西游之路——python全栈——django中orm的使用(1)
目录 首先推荐两篇文章:Django之ORM操作,http://www.cnblogs.com/yuanchenqi/articles/6083427.html十分全面. 另外和python---OR ...
- 西游之路——python全栈——Django之ORM操作
Django之ORM操作 前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计 ...
- 西游之路——python全栈——Django的web框架本质
知识预览 Django基本命令 二 路由配置系统(URLconf) 三 编写视图 四 Template 五 数据库与ORM admin的配置 一 什么是web框架? 框架,即framework,特指为 ...
- Django中的ORM模型
一.Djang的ORM框架 (一)ORM 1.O(objects):类和对象. 2.R(Relation):关系,关系数据库中的表格. 3.M(Mapping):映射. (二)ORM框架功能 1.建立 ...
- python全栈工程师完整版视频教程
来源: 来自网络,如侵权请告知博主删除????. 仅学习使用,请勿用于其他- 今天给大家分享一套Python全栈学习的视频,从目录可以看出真的太全面了~ day01-python 全栈开发-基础篇 ...
- python全栈示例_Python全栈之路--Django ORM详解
ORM:(在django中,根据代码中的类自动生成数据库的表也叫--code first) ORM:Object Relational Mapping(关系对象映射) 我们写的类表示数据库中的表 我们 ...
- 路飞学城python全栈开发_python 全栈开发,Day98(路飞学城背景,django ContentType组件,表结构讲解)...
昨日内容回顾 1. 为什么要做前后端分离?-前后端交给不同的人来编写,职责划分明确.-API (IOS,安卓,PC,微信小程序...)-vue.js等框架编写前端时,会比之前写jQuery更简单快捷. ...
- python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)...
python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页) 一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 fro ...
- 【Python全栈开发从入门到实战】持续更新中......
本专栏为Python全栈开发系列文章,技术包括Python基础.函数.文件.面向对象.网络编程.并发编程.MySQL数据库.HTML.JavaScript.CSS.JQuery.bootstrap.W ...
最新文章
- ASP.NET Core 2.0 : 九.从Windows发布到CentOS的跨平台部署
- Oracle的控制文件
- 英特尔是个可以讲理的地儿
- php代码审计工具_【学习笔记】PHP代码审计入门:代码审计实例2
- (原创)无废话C#设计模式之十二:Bridge
- 转:C#动态循环生成button怎么分别写他们的事
- 3、excel数据格式设置快捷键
- 关于Java中final关键字的详细介绍
- (MoMoCMS教程11)页面的SEO优化与外链
- 基于zbus的MySQL透明代理(100行)
- NLP任务增强:通过引入外部知识库来提供额外信息
- android编程好难,自学Android编程入门难吗
- 【深度学习技术】小样本医学影像的深度学习关键技术之深度模型的可解释性
- 11月4日绿健简报,星期五,农历十月十一
- c语言中各变量占得字节,在C语言中各种数据类型各占多少位
- 金蝶各版本软件迁移到金蝶K3WISE工具补丁合集
- 十一、海思HISI3556V200摄像头功能裁剪
- 应用交付工程师应该具备的关键能力(售后篇)
- Thinkpad Intel 5100无线网卡间歇性掉线问题解决方案
- 华为云弹性公网IP,如何解决现代企业的网络IP烦恼