文章目录

  • 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模型相关推荐

  1. 西游之路——python全栈——django中orm的使用(1)

    目录 首先推荐两篇文章:Django之ORM操作,http://www.cnblogs.com/yuanchenqi/articles/6083427.html十分全面. 另外和python---OR ...

  2. 西游之路——python全栈——Django之ORM操作

    Django之ORM操作 前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计 ...

  3. 西游之路——python全栈——Django的web框架本质

    知识预览 Django基本命令 二 路由配置系统(URLconf) 三 编写视图 四 Template 五 数据库与ORM admin的配置 一 什么是web框架? 框架,即framework,特指为 ...

  4. Django中的ORM模型

    一.Djang的ORM框架 (一)ORM 1.O(objects):类和对象. 2.R(Relation):关系,关系数据库中的表格. 3.M(Mapping):映射. (二)ORM框架功能 1.建立 ...

  5. python全栈工程师完整版视频教程

    来源: 来自网络,如侵权请告知博主删除????. 仅学习使用,请勿用于其他-  今天给大家分享一套Python全栈学习的视频,从目录可以看出真的太全面了~ day01-python 全栈开发-基础篇 ...

  6. python全栈示例_Python全栈之路--Django ORM详解

    ORM:(在django中,根据代码中的类自动生成数据库的表也叫--code first) ORM:Object Relational Mapping(关系对象映射) 我们写的类表示数据库中的表 我们 ...

  7. 路飞学城python全栈开发_python 全栈开发,Day98(路飞学城背景,django ContentType组件,表结构讲解)...

    昨日内容回顾 1. 为什么要做前后端分离?-前后端交给不同的人来编写,职责划分明确.-API (IOS,安卓,PC,微信小程序...)-vue.js等框架编写前端时,会比之前写jQuery更简单快捷. ...

  8. python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)...

    python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页) 一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 fro ...

  9. 【Python全栈开发从入门到实战】持续更新中......

    本专栏为Python全栈开发系列文章,技术包括Python基础.函数.文件.面向对象.网络编程.并发编程.MySQL数据库.HTML.JavaScript.CSS.JQuery.bootstrap.W ...

最新文章

  1. ASP.NET Core 2.0 : 九.从Windows发布到CentOS的跨平台部署
  2. Oracle的控制文件
  3. 英特尔是个可以讲理的地儿
  4. php代码审计工具_【学习笔记】PHP代码审计入门:代码审计实例2
  5. (原创)无废话C#设计模式之十二:Bridge
  6. 转:C#动态循环生成button怎么分别写他们的事
  7. 3、excel数据格式设置快捷键
  8. 关于Java中final关键字的详细介绍
  9. (MoMoCMS教程11)页面的SEO优化与外链
  10. 基于zbus的MySQL透明代理(100行)
  11. NLP任务增强:通过引入外部知识库来提供额外信息
  12. android编程好难,自学Android编程入门难吗
  13. 【深度学习技术】小样本医学影像的深度学习关键技术之深度模型的可解释性
  14. 11月4日绿健简报,星期五,农历十月十一
  15. c语言中各变量占得字节,在C语言中各种数据类型各占多少位
  16. 金蝶各版本软件迁移到金蝶K3WISE工具补丁合集
  17. 十一、海思HISI3556V200摄像头功能裁剪
  18. 应用交付工程师应该具备的关键能力(售后篇)
  19. Thinkpad Intel 5100无线网卡间歇性掉线问题解决方案
  20. 华为云弹性公网IP,如何解决现代企业的网络IP烦恼

热门文章

  1. 神经疾病都很严重吗?这4种病不需要特别治疗,别乱花钱
  2. 蜜蜂剪辑会员特权_会员有其特权
  3. java斗地主发牌代码_JAVA代码之斗地主发牌
  4. 一步到位,让你在手机上学会思维导图软件
  5. 计算机毕业设计Java大型商场应急预案管理系统(源码+系统+mysql数据库+lw文档)
  6. 迅雷java_Java 仿迅雷多线程下载
  7. /var/crash目录解析
  8. 魔兽争霸三不能初始化DirectX的解决办法
  9. vue 插件方式引入混入
  10. cut最后几位 shell_详解Shell cut用法