[python][django学习篇][3]创建django web的数据库模型
推荐学习博客:http://pythonzh.cn/post/8/
博客或者web界面向用户展示内容,它需要从某个地方获取博客内容或者web界面内容,才能够展示出来。通常来说:某个地方指的就是数据库
数据库的组织是根据我们的博客需求来设计的,
- 博客需求:博客初级版本主要包含博客文章,文章会有分类以及标签。一篇文章只能有一个分类,但可以打上很多标签因此,可以设计数据库的形式()
- 设计数据库组织一张表table
- 增加另外一个表,
这 3 篇文章的分类和标签都是相同的,这会产生很多重复数据,当数据量很大时就浪费了存储空间。
不同的文章可能它们对应的分类或者标签是相同的,所以我们把分类和标签提取出来,做成单独的数据库表,再把文章和分类、标签关联起来。
- 如何实现文章和分类,标签关联起来?,相应的表格形式
- 编程语言实现上面的表格设计
- 2和3是自然语言描述的表格,数据库也和编程语言一样,有它自己的一套规定的语法来生成上述的表结构,这样我们才能把数据存进去
- 通常情况下我们需要去学习如何设计数据库,但是django帮我们实现较多部分,Django 把那一套数据库的语法转换成了 Python 的语法形式,我们只要写 Python 代码就可以了,Django 会把 Python 代码翻译成对应的数据库操作语言。用更加专业一点的说法,就是 Django 为我们提供了一套 ORM(Object Relational Mapping)系统
- example,需求如下:在数据库里创建一个名为 category 的表格,这个表格的一个列名为 name。只需要在blog/models.py添加
class Category(models.Model):
name = models.CharField(max_length=100)- 上面的python语言:创建一个类Category继承(models.Model),其有一个属性(成员变量)name,翻译成数据库语言就是:创建了一个表,表名为Category,字段(列)名为name,同时会自动创建一个列:id 。总结就是:可以看出从 Python 代码翻译成数据库语言时其规则就是一个 Python 类对应一个数据库表格,类名即表名,类的属性对应着表格的列,属性名即列名。
- 因此,在blog/models.py修改来实现我们的博客需求:3个表文章(Post)、分类(Category)以及标签(Tag)
- 博客模型(数据库表)代码
# coding=utf8
from __future__ import unicode_literals from django.db import models
from django.contrib.auth.models import User
# Create your models here. class Category(models.Model):
"""
分类表Category
Django 要求模型必须继承 models.Model 类。
Category 只需要一个简单的分类名 name 即可
CharField 指定了分类名 name 的数据类型,chafField 是字符类型
CharField 的 max_length 参数指定其最大长度, 超过这个长度的分类名不能存入数据
Django 还提供了其他的数据类型,如日期整形等、
Django 内置的全部类型可查看文档:
https://docs.djangoproject.com/en/1.10/ref/models/fields/#field-types
""" name = models.CharField(max_length=100) class Tag(models.Model):
"""
标签表Tag ,有两个字段:id (自动创建)和标签name
""" name = models.CharField(max_length=70) class Post(models.Model):
"""
文章表Post
"""
# 文章标题字段
title = models.CharField(max_length=70) # 文章正文字段,使用TextField,文章内容较长所以用TextField
body = models.TextField() # 文章创建时间字段
create_time = models.DateTimeField() # 文章最后修改时间字段
modified_time = models.DateField() # 文章摘要字段,可以没有文章摘要,由于CharField必须存入数值,
# 通过设置CharField 的 blank=True参数允许文章摘要为空
excerpt = models.CharField(max_length=200, blank=True) # 这是分类与标签字段,分类和标签的模型我们已经创建
# 在这里主要是讲文章表Post和分类Category表,标签表Tag关联起来,但关联形式有点不同
# 我们需求:一篇文章只能对应一个分类Category,一个分类可以对应多篇文章即一对多的关系,使用ForeignKey
# 我们需求:一篇文章可以有多个标签,一个标签也可以对应多篇文章,即多对多关系,使用ManyToManyField
# 我们需求: 一篇文章必须有分类,可以没有没有标签blank=True
# 关联关系ForeignKey,ManyToManyField详情请参考文档:
# https://docs.djangoproject.com/en/1.10/topics/db/models/#relationships
category = models.ForeignKey(Category)
tags = models.ManyToManyField(Tag, blank=True) # 文章作者字段,这里的User是从 django.contrib.auth.models 导入的。
# django.contrib.auth 是Django内置应用,专门用来处理用户注册,登录流程
# User 是django.contrib.auth专门写好的模型(数据表)
# 和Useri表关联起来,一篇文章只能一个作者User,但一个作者User可以有多篇文章即一对多关系
author = models.ForeignKey(User)- 理解多对一(ForeignKey)关联关系
ForeignKey表明一种一对多的关联关系。比如这里我们的文章和分类的关系,一篇文章只能对应一个分类,而一个分类下可以有多篇文章。反应到数据库表格中,它们的实际存储情况是这样的:文章 ID 标题 正文 分类 ID 1 title 1 body 1 1 2 title 2 body 2 1 3 title 3 body 3 1 4 title 4 body 4 2 分类 ID 分类名 1 Django 2 Python
7. 理解多对多(ManyToManyField)关联关系
ManyToManyField表明一种多对多的关联关系,比如这里的文章和标签,一篇文章可以有多个标签,而一个标签下也可以有多篇文章。反应到数据库表格中,它们的实际存储情况是这样的:文章 ID 标题 正文 1 title 1 body 1 2 title 2 body 2 3 title 3 body 3 4 title 4 body 4 标签 ID 标签名 1 Django 学习 2 Python 学习 文章 ID 标签 ID 1 1 1 2 2 1 3 2 多对多的关系无法再像一对多的关系中的例子一样在文章数据库表加一列 分类 ID来关联了,因此需要额外建一张表来记录文章和标签之间的关联。例如文章 ID 为 1 的文章,既对应着 标签 ID 为 1 的标签,也对应着 标签 ID 为 2 的标签,即文章 1 既属于标签 1:Django 学习,也属于标签 2:Python 学习。
反之,标签 ID 为 1 的标签,既对应着 文章 ID 为 1 的文章,也对应着 文章 ID 为 2 的文章,即标签 1:Django 学习下有两篇文章。
希望这个例子能帮助你加深对多对多关系,以及它们在数据库中是如何被关联的理解,更多的例子请看文末给出的 Django 官方参考资料。
8. 关联关系官方文档
两种关系的说明以及更多官方的例子以加深理解:
[python][django学习篇][3]创建django web的数据库模型的更多相关文章
- [python][django学习篇][2]创建django app
推荐学校django博客:http://pythonzh.cn/post/8/ django app 可以理解为一个文件夹: 里面包含了相关功能的代码.通过manage.py来创建 web app 激 ...
- Django学习篇(第二部)
4.Django pip3 install django C:\Python35\Scripts # 创建Django工程 django-admin startproject [工程名称] mysit ...
- [python][django学习篇][5]选择数据库版本(默认SQLite3) 与操作数据库
推荐学习博客:http://zmrenwu.com/post/6/ 选择数据库版本(SQLite3) 如果想选择MySQL等版本数据库,请先安装MySQL并且安装python mysql驱动,这里不做 ...
- [python][django学习篇][4]django完成数据库代码翻译:迁移数据库(migration)
上一篇我们已经完成数据库的设计,但是仅仅是python语言,并没有真正创建了数据库表.翻译成数据库语言,真正创建数据库表由django manage.py来实现,这一过程专业术语:迁移数据库 切换到m ...
- [python][django学习篇][7]设计博客视图(1)
1上网的流程: 打开浏览器,输入网址(http://zmrenwu.com/) 浏览器根据输入网址,完成以下几件事:1识别服务器地址,2将用户的浏览意图打包成一个http请求,发送给服务器,等待服务器 ...
- [python][django学习篇][9]设计正在博客视图(3)
需求: 真正的首页视图函数,当用户访问我们的博客首页时,他将看到我们发表的博客文章列表,就像 演示项目 里展示的这样.t https://docs.djangoproject.com/en/1.10/ ...
- [python][django学习篇][8]django 视图(2) --简单模板
在视图函数里返回的是一个 HttpResponse 类的实例,我们给它传入了一个希望显示在用户浏览器上的字符串.但是我们的博客不可能只显示这么一句话,它有可能会显示很长很长的内容.比如我们发布的博客文 ...
- django学习-数据库配置-创建模型
数据库配置 在mysite/settings.py中,包含了django项目设置的python模块 通常,这个配置文件使用SQLite作为默认数据库.如果你不熟悉数据库,或者只是想尝试下django, ...
- Django学习之二:Django 项目创建 和 应用创建
Django 项目创建 和 应用创建 创建一个Django项目 都是在相应平台的命令行环境下操作: 1. 进入用于存放项目的目录下 1.1 windows下切换目录:先进入具体的分区磁盘中如E盘就输入 ...
随机推荐
- LeetCode Missing Number (简单题)
题意: 给一个含有n个整数的数组,数组中的元素应该是0-n.现在缺了其中某1个,找出缺少的那个整数? 思路: 0-n的总和是可以直接计算的,而缺少的那个就是sum减去数组的和. int missing ...
- 三种zigbee网络架构详解
在万物互联的背景下,zigbee网络应用越加广泛,zigbee技术具有强大的组网能力,可以形成星型.树型和网状网,三种zigbee网络结构各有优势,可以根据实际项目需要来选择合适的zigbee网络结构 ...
- js实现排序去重计算字符次数
/*去重*/ var arr=[1,4,4,7,3,9,0,3,2,1,"你好","你","你好","你 "]; var ...
- linux 命令——38 cal (转)
cal命令可以用来显示公历(阳历)日历.公历是现在国际通用的历法,又称格列历,通称阳历.“阳历”又名“太阳历”,系以地球绕行太阳一周为一年,为西方各国所通用,故又名“西历”. 1.命令格式: cal ...
- 【洛谷】CYJian的水题大赛 解题报告
点此进入比赛 \(T1\):八百标兵奔北坡 这应该是一道较水的送分题吧. 理论上来说,正解应该是DP.但是,.前缀和优化暴力就能过. 放上我比赛时打的暴力代码吧(\(hl666\)大佬说这种做法的均摊 ...
- kubernetes-控制器Deployment和DaemonSet(八)
Pod与controllers的关系 •controllers:在集群上管理和运行容器的对象•通过label-selector相关联•Pod通过控制器实现应用的运维,如伸缩,升级等 控制器又称工作负载 ...
- iterable -------JavaScript
本文摘要:http://www.liaoxuefeng.com/ 遍历Array可以采用下标循环,遍历Map和Set就无法使用下标.为了统一集合类型,ES6标准引入了新的iterable类型,Arra ...
- 多线程中使用HttpContext.Current为null的解决办法
HttpContext.Current.Server.MapPath(logFile) 这个是得到具体路径的方法 正常情况下是可以的 多线程情况下就为null 下边的代码原本的作用是把网站的异常 ...
- 移动端rem匹配
Rem是相对于根元素font-size大小的单位 记inphone5屏幕宽度是 320px font-size16px 1rem=16px <html> <head> ...
- eclipse 导出Runnable JAR file ,双击无法执行原因与解决 双击后闪退的原因 批处理java打包文件 @echo off start javaw -jar *.jar
eclipse 导出Runnable JAR file 导出后如果系统没有JRE,双击无法运行,需要用命令方法 安装后解决,如图 双击后闪退的原因,通过执行 java -jar TingGe.jar ...

