ORM:对象关系映射

一:MTV开发模式
把数据存取逻辑、业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的 Model-View-Controller(MVC)模式。 在这个模式中,Model 代表数据存取层,View 代表的是系统中选择显示什么和怎么显示的部分,Controller 指的是系统中根据用户输入并视需要访问模型,以决定使用哪个视图的那部分。

Django也遵循这种MVC开发模式,只不过更名为MTV,下边是django所对应的MVC
M ,数据存取部分,由django数据库层处理,本章要讲述的内容。

V ,选择显示哪些数据要显示以及怎样显示的部分,由视图和模板处理。

3
C ,根据用户输入委派视图的部分,由 Django 框架根据 URLconf 设置,对给定 URL 调用适当的 Python 函数。

由于 C 由框架自行处理,而 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架 。在 MTV 开发模式中:

M 代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。

T 代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。

V 代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。

二:一对多的模型构建

定义:注意先后顺序
(一个作者对应多本书)
class User(models.Model):
username = models.CharField(max_length=20)
password = models.CharField(max_length=20)

def __unicode__(self): #定义表内容显示的标题
return self.username

class Meta: #自定义数据表名称
db_table = "User"

class Blog(models.Model):
#verbose_name='' : 表示后台中显示的对应名称
title = models.CharField(max_length=20, verbose_name='标题') #文章标题
author = models.ForeignKey(User,related_name="blog_author") #外键
#author = models.CharField(max_length=15,verbose_name='作者') #作者
time = models.TimeField(verbose_name='发表时间') #时间
tag = models.CharField(blank=True,max_length=100,verbose_name='文章标签') #文章标签 blank=True表示该空格可选填
content = models.TextField(verbose_name='内容') #内容

def __unicode__(self): #后台中显示的标题
return self.title

class Meta: #自定义数据表名字
db_table = "Blog"

三:多对多的模型构建
    
    注意先后顺序
    (一个作者可以编写多种类别的文章,一个类别的文章可以被多个作者编写)
class Author(models.Model):
name = models.CharField(max_length=15)

class Blog(models.Model):
#verbose_name='' : 表示后台中显示的对应名称
title = models.CharField(max_length=20, verbose_name='标题') #文章标题
authors = models.ManyToManyField(Author,verbose_name="作者") #外键
#author = models.CharField(max_length=15,verbose_name='作者') #作者
time = models.TimeField(verbose_name='发表时间') #时间
tag = models.CharField(blank=True,max_length=100,verbose_name='文章标签') #文章标签 blank=True表示该空格可选填
content = models.TextField(verbose_name='内容') #内容

def __unicode__(self): #后台中显示的标题
return self.title

class Meta: #自定义数据表名字
db_table = "Blog"

class Category(models.Model):
category = models.CharField(max_length=20,verbose_name='类别')
blog = models.ForeignKey(Blog,related_name="category_blog") #类别
author = models.ForeignKey(User,related_name="category_author") #外键
def __unicode__(self):
return self.category

class Meta:
db_table = "Category"
四:添加模块的字符串表现
class Author(models.Model):
name = models.CharField(max_length=15)
插入和更新数据
a = Author(name='aaa')
a.save()

选择对象
Author.objects.all()

数据过滤
Author.objects.filter(name='Apress',age=12) #以字典形式传值

获取单个对象
Author.objects.get(name='Apress')
这样,就返回了单个对象,而不是列表(更准确的说,QuerySet)。 所以,如果结果是多个对象,会导致抛出异常
如果查询没有返回结果也会抛出异常

数据排序
Author.order_by("name")

连锁查询
Author.objects.filter(name="sss").order_by("-name")

限制返回的数据
Author.order_by("name")[0]

更新多个对象
Author.objects.filter(id=52).update(name='Apress Publishing')

删除对象
Author.objects.filter(name="sss").delete()

五:模板继承
class Book(models.Model):
title = models.CharField(max_length=100)
genre = models.CharField(max_length=100)
num_pages = models.IntergerField()
authors = models.ManyToManyField(Author)

def __unicode__(self):
return self.title

class Meta:
abstract = True

class SmithBook(Book):
authors = models.ManyToManyField(Author, limit_choices_to = {
'name_endswith': 'Smith'
})
这里代码的关键是 abstract = True 设置, 指明了Book是一个抽象基础类
没有了Meta abstract 选项,
在一个空数据库和这个 models.py 文件上运行 manage.py syncdb 会创建三张表 Author, Book, SmithBook

而抽象基础类的情况下,只创建了 Author, SmithBook 两张表。

六:Meta嵌套类
Meta类处理的是模型的各种元数据的使用和显示:

比如在一个对象对多个对象是,它的名字应该怎么显示;
查询数据表示默认的排序顺序是什么?
数据表的名字是什么
多变量唯一性 (这种限制没有办法在每个单独的变量声明上定义)
class Person(models.Model):
first = models.CharField(max_length=100)
last = models.CharField(max_length=100)
middle = models.CharField(max_length=100, blank=True)

class Meta:
ordering = ['last', 'first', 'middle']
unique_together = ['first', 'last', 'middle']

#Django默认的复数形式是加 s,这里不适用

---------------------
作者:Thinkgamer_gyt
来源:CSDN
原文:https://blog.csdn.net/gamer_gyt/article/details/50167843
版权声明:本文为博主原创文章,转载请附上博文链接!

03.Django的MTV开发模式详解和模型关系构建的更多相关文章

  1. Extjs MVC开发模式详解

    Extjs MVC开发模式详解   在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开发模式, ...

  2. ext.js的mvc开发模式详解

    ext.js的mvc开发模式详解和环境配置 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开 ...

  3. 使用django的MTV开发模式返回一个网页

    1.MTV开发模式介绍 M:Models 模型(数据) 与数据组织相关的功能.组织和存储数据的方法和模式,与数据模型相关的操作. T:Templates 模板(样式) 与表现相关的所有功能.页面展示风 ...

  4. MVC开发模式详解

    转自:https://blog.csdn.net/qq_33991989/article/details/78966071 MVC设计模式详解 1.Model-View-Controller(模型-视 ...

  5. JAVA 23种开发模式详解(代码举例)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  6. 第一篇:Win10系统搭建Python+Django+Nginx+MySQL 开发环境详解(完美版)

    Win10+Python+Django+Nginx+MySQL 开发环境搭建详解 PaulTsao 说明:本文由作者原创,仅供内部参考学习与交流,转载引用请注明出处,用于商业目的请联系作者本人. Wi ...

  7. Django MTV 开发模式 + 数据库配置

    MTV 开发模式 Django 的设计鼓励松耦合及对应用程序中不同部分的严格分割.遵循这个理念的话,要想修改应用的某部分而不影响其它部分就比较容易了.在视图函数中,我们已经讨论了通过模板系统把业务逻辑 ...

  8. django入门(二)MTV开发模式

    MTV开发模式,顾名思义,M是models,T是templates,V是view. 之前的教程没有牵扯到html,然后今天将告诉你如何转到自己做的静态页面 首先还是先创建一个app,python ma ...

  9. Python开发技术详解PDF

    Python开发技术详解(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1F5J9mFfHKgwhkC5KuPd0Pw 提取码:xxy3 复制这段内容后打开百度网盘手 ...

随机推荐

  1. 解决Everything1.4版本预览时不支持自定义后缀的问题

    2017年6月Everything版本升级到了1.4.x 个人使用下来认为最主要的有以下几点 添加预览功能 搜索结果多选 点击目录列即打开文件所在目录(需要设置:常规->结果->双击路径列 ...

  2. CSS单行格式化与压缩

    工具简介:CSS单行格式化与压缩工具

  3. git变慢的原因

    最近使用git更新代码变慢,进一步试了一下提交代码.执行git命令都很慢,换了idea的工作目录.更换git版本,所有操作都是徒劳. 最后关了火绒杀毒软件,才快了起来. 坑坑坑坑坑的火绒杀毒!浪费我至 ...

  4. 分析轮子(二)- << ,>>,>> (左移、右移、无符号右移)

    前言:写 分析轮子(一)-ArrayList.java 的时候看到源码中有 int newCapacity = oldCapacity + (oldCapacity >> 1); 这样的代 ...

  5. 关于python单例的常用几种实现方法

    这两天在看自己之前写的代码,所以正好把用过的东西整理一下,单例模式,在日常的代码工作中也是经常被用到, 所以这里把之前用过的不同方式实现的单例方式整理一下 装饰器的方式 这种方式也是工作中经常用的一种 ...

  6. hive hbase区别

    1.hive是sql语言,通过数据库的方式来操作hdfs文件系统,为了简化编程,底层计算方式为mapreduce. 2.hive是面向行存储的数据库. 3.Hive本身不存储和计算数据,它完全依赖于H ...

  7. maven项目打包额外lib目录

    maven项目依赖了几个额外的jar包一直都无法打进最终jar,不知道哪里出了问题.一直对这块不甚清楚,就大概梳理一下 默认打包方式: maven项目下,默认编译目录为 src/main/java和s ...

  8. jqweui 关于$(document.body).infinite的bug

    jqweui,0.8.2版本infinite存在bug,会存在下拉不触发的情况,解决办法: 源代码3730行附近 Infinite.prototype.scroll = function() { va ...

  9. 【分享】Vue 资源典藏(UI组件、开发框架、服务端、辅助工具、应用实例、Demo示例)

    Vue 资源典藏,包括:UI组件 开发框架 服务端 辅助工具 应用实例 Demo示例 element ★11612 - 饿了么出品的Vue2的web UI工具套件 Vux ★7503 - 基于Vue和 ...

  10. macbook air 2012 mid 安装 windows10 双系统遇到错误 no bootable device insert boot disk and press any key

    macbook型号:air 2012 mid 当前操作系统:mojave 安装工具:boot camp assistant 要安装的双系统:windows 10家庭版 安装教程:百度搜一堆 安装过程中 ...