java进阶架构师”,选择右上角“置顶公众号

20大进阶架构专题每日送达

模型设计

回顾

前三章我们可以算是一脚迈进了Django的大门(也称入坑),因为程序员入坑第一步就是学会Hello World。希望你别骄傲,我们接下来才是真正的旅途——一起领略Django真正的迷人之处。

模型本质

现在,我们来学习模型,Django模型层是Django框架自定义的一套独特的ORM(Object Relational Mapping,关系映射模型)技术。

模型本质上就是数据库表的布局,再附加一些元数据。模型包含了你要在数据库中创建的字段信息及对数据表的一些操作。

基本操作

想要操作模型,我们先来了解Django模型层的大概。使用Django模型开发的首要任务就是定义模型类及其属性,每个模型的物理存在方式就是一个Python的类Class,每个模型代表数据库中的一张表,每个类的实例代表数据表中的一行数据,而类中的每个属性被映射为数据表中的一列字段。

可能你还是很懵逼,没关系,我们从伪代码中再来看看这些概念。

  1. 模型类定义

模型定义的基本结构如下:

from django.db import models
class ModelName(models.Model):
field1 = models.XXField(...)
fiels2 = models.XXField(...)
...
class Meta:
db_table = ...
other metas = ...

解析如下:

  • 所有Django模型都是django.db.models.Model类的子类。每个类都会被转换为数据库表

  • 通过其中的类属性定义模型字段,模型字段必须是某种models.XXField类型,比如CharField,DateTimeField等等,而这些就会被转换为对应数据库表中的列

  • 通过模型类中的Meta子类定义模型元数据,比如数据库表名、数据默认排序方式等。

我们来详细看一个样例:定义了一个 Person, 其拥有 first_name 和 last_name:

from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)

first_name 和 last_name 是模型的字段。每个字段都被指定为一个类属性,并且每个属性映射为一个数据库列。

上面的 Person 模型会创建一个如下的数据库表:

CREATE TABLE myapp_person (
"id" serial NOT PRIMARY KEY,
"first_name" varchar(30) NOT ,
"last_name" varchar(30) NOT
);

我们介绍一下class Meta中的那些属性,Meta类的属性名由Django预定义,我们无需自己创建,Model 元数据就是 "不是一个字段的任何数据" -- 比如排序选项,常见的Meta类属性汇总如下:

  • abstract: True or False,标识本类是否为抽象基类

  • app_label:定义本类所属的应用,比如app_labels = 'myapp'

  • db_table:映射的数据表名,比如db_table='db_blogs'

  • default_related_name:定义本模型的反向关系引用名称,默认与模型名一致。

  • ordering:本模型记录的默认排序字段,可以设置多个字段,默认以升序排列,如果降序需要在字段前加“负号”。比如,按文章发布时间降序显示:

class Meta:
ordering = ("-publish_date

排序字段设计_「原创」第四章、模型设计相关推荐

  1. 排序字段设计_内容搜索排序表达式的最佳实践

    简介:本文重点介绍"开放搜索"中的排序表达式的配置及特征性函数的应用 某新闻资讯平台,在内容搜索场景中需要满足业务多样化,个性化的需求,在query改写配置好后,希望在排序阶段进行 ...

  2. pep8 python 编码规范_「原创」「python自学笔记」python编码规范

    编码规范是学习一个语言前必须要了解的. Python采用PEP8作为编码规范,PEP是Python Enhancement Proposal(Python 增强建议书)的缩写,8代表的是Python代 ...

  3. 先进制造技术论文_「原创」轴承先进锻造工艺及制造技术

    我国中小型轴承锻造成形工艺经历了从1980年以前的棒料打孔.单挤.辗扩,发展到现在的自动化.近净成形.高速锻等技术,不断推陈出新,表1为由1980年以前到现今的轴承锻造成形工艺的发展历程. 国内轴承质 ...

  4. 千图成像_「原创」千图成像,用PS给人物制作全图的拼人像

    本篇教程要制作一种马赛克效果的拼图,但又不是单纯的马赛克,中间还会有若隐若现的人像,整体看上去很高级,发朋友圈引来很多赞的那种,制作起来也是很简单,是那种只要你动手,就可以学会的那种,很有效果,很好学 ...

  5. filco蓝牙不好用_「原创」开箱 FILCO 斐尔可 蓝牙双模键盘+更换键帽

    朋友之前定了Leopold 750,于是,我就屁颠屁颠的过去要求开箱了,话不多说接下来就是喜闻乐见的开箱了. FILCO 斐尔可 蓝牙双模键盘 键盘防城罩很棒,所有键位都覆盖了,拔键器也很棒,感觉做工 ...

  6. wsl2启动桌面_「原创」windows10下自定义WSL安装路径及启动WSL2

    win10是目前在win系列的个人操作系统中,个人觉得是最好用的,没有之一.现在又能拥有WSL2的功能,让ubuntu与win10无缝的结合.简直就是完美的不能再完美了.享受着win10的强大桌面系统 ...

  7. 你的设计应该「所见即所得」

    本文讲的是你的设计应该「所见即所得」, 几年前的一个夏天,我有机会住在旧金山里同一栋楼不同单元的两个 Loft 公寓中. 由于这是同一栋楼,所以你可能会想这两个单元应该是相似的.的确,它们都有1000 ...

  8. 「图论」第1章 并查集课堂过关

    文章目录 A. [例题1][模板]并查集 题目 代码 B. [例题2]程序自动分析 题目 代码 C. [例题3]银河英雄传说 题目 题目背景 题目描述 输入格式 输出格式 输入输出样例 说明/提示 思 ...

  9. 《Reids 设计与实现》第十四章 集群(上)

    <Reids 设计与实现>第十四章 集群(上) 文章目录 <Reids 设计与实现>第十四章 集群(上) 一.简介 二.节点 1.启动节点 2.集群数据结构 3.CLUSTER ...

最新文章

  1. MongoDB 删除数据库
  2. linux系统启动流程详解
  3. 分布式事物解决方案-TCC
  4. redis(一)--简介
  5. 【译】CodeIgniter HMVC模块扩展使用文档
  6. 870C. Maximum splitting
  7. 怎么利用ffmpeg和AviSynth给在windows下面为flv文件加水印
  8. 华为鸿蒙联合品牌,魅族官宣:接入华为鸿蒙!这是国产智能手机品牌的首个公开表态!...
  9. 60多年来计算机是根据什么的发展,计算机复习题98197.doc
  10. 54. mysqli 扩展库
  11. java小程序(万年历)
  12. HDU - 6070 线段树 + 分数规划
  13. 客户要管理,就靠crm吗?
  14. 数字化改造大宗商品供应链 ,为大宗商品贸易增添活力
  15. python dataframe 列筛选_pandas系列之DataFrame 行列数据筛选实例
  16. 推荐使用Windows10企业版LTSC的理由
  17. Oracle中的sql语句
  18. os系统解决seaborn中文乱码问题 Font family [‘SiHei‘] not found
  19. eleUi解决表单中el-select选择器比el-input输入框小的问题
  20. java编程实现删除一个文件夹_Java实现文件夹删除方式总结详解

热门文章

  1. VS中怎么新建Web服务器项目,VS中新建网站和新建WEB项目的区别
  2. SQL注入——报错注入
  3. Android零基础入门第24节:自定义View简单使用
  4. 10-线程,进程,协程,IO多路复用
  5. glance部署及操作
  6. xcode7.2 真机测试
  7. SCGHR_存储过程(eSP_IDChangeStart)_政治面貌为什么不能正确更新
  8. 一些关于“数据挖掘介”技术的有用文档
  9. 【题解】Luogu P3674 小清新人渣的本愿
  10. MySQL-数据库增删改查