Python Web开发系列课程之——介绍ORM & 创建Model

【前置课程】你的第一个Django View

  • 【5分钟】ORM概念理解

    • 对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。

    • 它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。

    • 优点:摆脱复杂的SQL操作,适应快速开发;不需要开发一个专用的、庞大的数据访问层;让数据结构变得简洁;数据库迁移成本更低(如从mysql->oracle);

    • 缺点:牺牲程序的执行效率和会固定思维模式;ORM是一种完全的面向对象的做法,而面向对象的做法也会对性能产生一定的影响;复杂的SQL操作还需通过SQL语句实现;

    • 对象-关系映射(ORM),是随着面向对象的软件开发方法发展而产生的。用来把对象模型表示的对象映射到基于S Q L 的关系模型数据库结构中去。这样,我们在具体的操作实体对象的时候,就不需要再去和复杂的 SQ L 语句打交道,只需简单的操作实体对象的属性和方法。O R M 技术是在对象和关系之间提供了一条桥梁,前台的对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化。

    • 一般的ORM包括以下四部分:

      • 一个对持久类对象进行CRUD操作的API;
      • 一个语言或API用来规定与类和类属性相关的查询;
      • 一个规定mapping metadata的工具;
      • 一种技术可以让ORM的实现同事务对象一起进行dirty checking, lazy association fetching以及其他的优化操作。
    • 讲解:举几个简单的例子说明,这部分关键是概念上的理解。这部分内容会帮助理解后续代码实现。

  • 【10分钟】创建调查用户信息的Model

    • 根据业务需求创建名为【UserInfo】的Model;一旦定义了Model,就要告诉django你需要使用它们;
    • 注意:【UserInfo】是【investigate】中的一个Model。一个App可以拥有多个像【UserInfo】这样的Model。
    • 为【UserInfo】创建字段(Fields),字段的类型将告诉数据库存储的数据类型(比如:INTEGER,VARCHAR,TEXT,DATETIME)
INSTALLED_APPS = [
    #...
    'investigate',
    #...]
  • 常用的字段类型清单
名称 说明
AutoField 一个自动递增的整型字段,添加记录时它会自动增长。你通常不需要直接使用这个字段;如果你不指定主键的话,系统会自动添加一个主键字段到你的model。(参阅自动主键字段)
BooleanField 布尔字段,管理工具里会自动将其描述为checkbox。
CharField 字符串字段,单行输入,用于较短的字符串,如要保存大量文本, 使用 TextField;CharField有一个必填参数:CharField.max_length:字符的最大长度,django会根据这个参数在数据库层和校验层限制该字段所允许的最大字符数。
TextField 一个容量很大的文本字段, admin 管理界面用 <textarea>多行编辑框表示该字段数据。
CommaSeparatedIntegerField 用于存放逗号分隔的整数值。类似 CharField,必须maxlength 参数。
DateField 日期字段
DateTimeField 类似 DateField 支持同样的附加选项。
EmailField 一个带有检查 Email 合法性的 CharField,不接受 maxlength 参数。
FileField 一个文件上传字段。 要求一个必须有的参数: upload_to, 一个用于保存上载文件的本地文件系统路径。
FilePathField 选择指定目录按限制规则选择文件,有三个参数可选, 其中”path”必需的,这三个参数可以同时使用
FloatField 浮点型字段。 必须提供两个 参数, 参数描述:max_digits:总位数(不包括小数点和符号) decimal_places:小数位数。如:要保存最大值为 999 (小数点后保存2位),你要这样定义字段:models.FloatField(…,max_digits=5, decimal_places=2),要保存最大值一百万(小数点后保存10位)的话,你要这样定义:models.FloatField(…,max_digits=19, decimal_places=10)
ImageField 类似 FileField, 不过要校验上传对象是否是一个合法图片。它有两个可选参数:height_field 和 width_field,如果提供这两个参数,则图片将按提供的高度和宽度规格保存。 该字段要求 Python Imaging 库。
IntegerField 用于保存一个整数。
IPAddressField 一个字符串形式的 IP 地址, (如 “202.1241.30″)。
NullBooleanField 类似 BooleanField, 不过允许 NULL 作为其中一个选项。 推荐使用这个字段而不要用 BooleanField 加 null=True 选项。 admin 用一个选择框 <select> (三个可选择的值: “Unknown”, “Yes” 和 “No” ) 来表示这种字段数据。
PhoneNumberField 一个带有合法美国风格电话号码校验的 CharField(格式:XXX-XXX-XXXX)。
PositiveIntegerField 类似 IntegerField, 但取值范围为非负整数(这个字段应该是允许0值的…可以理解为无符号整数)
PositiveSmallIntegerField 正小整型字段,类似 PositiveIntegerField, 取值范围较小
SlugField 是一个报纸术语. slug 是某个东西的小小标记(短签), 只包含字母,数字,下划线和连字符.它们通常用于URLs。
SmallIntegerField 类似 IntegerField, 不过只允许某个取值范围内的整数。(依赖数据库)
TimeField 时间字段,类似于 DateField 和 DateTimeField。
URLField 用于保存 URL。 若 verify_exists 参数为 True (默认), 给定的 URL 会预先检查是否存在(即URL是否被有效装入且没有返回404响应)。
USStateField 美国州名缩写,由两个字母组成。
XMLField XML字符字段,校验值是否为合法XML的 TextField,必须提供参数:schema_path:校验文本的 RelaxNG schema 的文件系统路径。

附:Field 选项

选项 说明
null 缺省设置为false.通常不将其用于字符型字段上,比如CharField,TextField上.字符型字段如果没有值会返回空字符串。
blank 该字段是否可以为空。如果为假,则必须有值
choices 一个用来选择值的2维元组。第一个值是实际存储的值,第二个用来方便进行选择。如SEX_CHOICES= ((‘F’,'Female’),(‘M’,'Male’),)
core db_column,db_index 如果为真将为此字段创建索引
default 设定缺省值
editable 如果为假,admin模式下将不能改写。缺省为真
help_text admin模式下帮助文档
primary_key 设置主键,如果没有设置django创建表时会自动加上ID作为主键
radio_admin 用于admin模式下将select转换为radio显示。只用于ForeignKey或者设置了choices
unique 数据唯一
unique_for_date 日期唯一,如下例中系统将不允许title和pub_date两个都相同的数据重复出现 title = meta.CharField(maxlength=30,unique_for_date=’pub_date’)
unique_for_month / unique_for_year 用法同上
validator_list 有效性检查。非有效产生 django.core.validators.ValidationError 错误
  • 【UserInfo】当中的部分Fileds示例代码
js_id = models.CharField(max_length=100, verbose_name=u"简书id")
age = models.IntegerField(verbose_name=u"年龄")
time = models.DateTimeField(default=timezone.now, verbose_name=u"时间")
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容