03.Django的MTV开发模式详解和模型关系构建

简介: ORM:对象关系映射 一:MTV开发模式 把数据存取逻辑、业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的 Model-View-Controller(MVC)模式。 在这个模式中,Model 代表数据存取层,View 代表的是系统中选择显示什么和怎么显示的部分,Controller 指的是系统中根据用户输入并视需要访问模型,以决定使用哪个视图的那部分。
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,这里不适用
    verbose_name_plural = "people"

相关文章
|
1月前
|
机器学习/深度学习 前端开发 网络架构
Django如何调用机器学习模型进行预测
Django如何调用机器学习模型进行预测
59 5
|
1月前
|
机器学习/深度学习 监控 数据挖掘
基于Django和百度飞桨模型的情感识别Web系统
基于Django和百度飞桨模型的情感识别Web系统
38 5
|
1月前
|
机器学习/深度学习 算法 搜索推荐
django调用矩阵分解推荐算法模型做推荐系统
django调用矩阵分解推荐算法模型做推荐系统
29 4
|
1月前
|
开发框架 前端开发 数据库
使用Django框架构建一个完整的Web应用
【10月更文挑战第2天】使用Django框架构建一个完整的Web应用
33 1
|
1月前
|
存储 Python
使用django构建一个多级评论功能
使用django构建一个多级评论功能
21 0
|
1月前
|
监控 应用服务中间件 网络安全
部署Django应用:使用Gunicorn和Nginx构建高效的生产环境
部署Django应用:使用Gunicorn和Nginx构建高效的生产环境
116 0
|
1月前
|
存储 开发框架 JSON
【查漏补缺】Django模型字段类型及其应用
【查漏补缺】Django模型字段类型及其应用
20 0
|
2月前
|
数据处理 Python
Django视图:构建动态Web页面的核心技术
Django视图:构建动态Web页面的核心技术
|
3月前
|
前端开发 数据管理 数据处理
Django的MTV
【8月更文挑战第13天】
29 4
|
3月前
|
机器学习/深度学习 前端开发 数据挖掘
基于Python Django的房价数据分析平台,包括大屏和后台数据管理,有线性、向量机、梯度提升树、bp神经网络等模型
本文介绍了一个基于Python Django框架开发的房价数据分析平台,该平台集成了多种机器学习模型,包括线性回归、SVM、GBDT和BP神经网络,用于房价预测和市场分析,同时提供了前端大屏展示和后台数据管理功能。
103 9