Python Django框架笔记(五):模型

#前言部分来自Django Book

(一)    前言

大多数web应用本质上:

1、 每个页面都是将数据库的数据以HTML格式进行展现。

2、 向用户提供修改数据库数据的方法。(例如:注册、发表评论信息等)

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

对于Django,可以理解为遵循MVC模式:

  • M,数据存取部分,由django数据库层处理,即模型。
  • V,选择显示哪些数据要显示以及怎样显示的部分,由视图和模板处理。
  • C,根据用户输入委派视图的部分,由 Django 框架根据 URLconf 设置,对给定 URL 调用适当的 Python 函数。

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

  • M代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
  • T代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
  • V代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。

如果你熟悉其它的 MVC Web开发框架,比方说 Ruby on Rails,你可能会认为 Django 视图是控制器,而 Django 模板是视图。 很不幸,这是对 MVC 不同诠释所引起的错误认识。 在 Django 对 MVC 的诠释中,视图用来描述要展现给用户的数据;不是数据 如何展现 ,而且展现 哪些 数据。 相比之下,Ruby on Rails 及一些同类框架提倡控制器负责决定向用户展现哪些数据,而视图则仅决定 如何 展现数据,而不是展现 哪些 数据。

两种诠释中没有哪个更加正确一些。 重要的是要理解底层概念。

(二)    定义模型

例如,现在有球队、球员、主教练、雇主

(因为django 建表的时候会自动生成一个ID,除非另外指定。感觉用这个就挺方便的,所以主键就不用球队编号了,球队编号要唯一的话,做个校验不让用户提交就行了)

球队:球队ID、球队编号,名称,成立时间,人数,主场地址  

球员:姓名、身份证号、出生日期、身高、家庭住址、手机号码、邮箱、球队ID

主教练:姓名、身份证号、出生日期、资格证书号、级别、手机号码、邮箱、球队ID

雇主:姓名、身份证号、球队ID

球队 -球员:1对多。

球队-主教练:1对1

球队-雇主:多对多。(虽然同一级别赛事,雇主应该只能持有一个球队(不太了解),不过不管怎样,这里假定一个人可以持有多只球队,一个球队也可以同时被多人持有)

 1 from django.db import models
 2 from django import forms
 3 # Create your models here.
 4 
 5 
 6 #球队模型
 7 class Team(models.Model):
 8     team_num = models.CharField(max_length=100) #球队编号
 9     team_name = models.CharField(max_length=30) #球队名称
10     establish_data = models.DateTimeField() #成立时间
11     people_num = models.PositiveIntegerField() #人数
12     address_home = models.CharField(max_length=200) #主场地址
13 #球员 模型
14 class Player(models.Model):
15     player_name = models.CharField(max_length=30) #球员名称
16     player_card = models.CharField(max_length=30) #球员身份证
17     birth_data = models.DateTimeField() #出生日期
18     player_height = models.PositiveIntegerField() #球员身高
19     player_address = models.CharField(max_length=200)#家庭住址
20     player_phone = models.PositiveIntegerField() #球员手机号
21     player_email = models.EmailField()#邮箱
22     team = models.ForeignKey(Team,on_delete=models.CASCADE)#外键
23 #主教练 模型
24 class Coach(models.Model):
25     coach_name = models.CharField(max_length=30)#主教练名称
26     coach_card = models.CharField(max_length=20)
27     birth_data = models.DateTimeField()
28     certificate = models.ImageField()
29     coach_level = models.PositiveIntegerField()
30     coach_phone = models.PositiveIntegerField()
31     coach_email = models.EmailField()
32     team = models.ForeignKey(Team,on_delete=models.CASCADE) #外键
33 #雇主 模型
34 class Employer(models.Model):
35     employer_name = models.CharField(max_length=30)
36     employer_card = models.CharField(max_length=20)
37     team = models.ManyToManyField(Team) #定义多对多关系

对于多对多关系,Django会创建一个一个额外的表(多对多连接表)来处理他们之间的映射关系

https://docs.djangoproject.com/en/dev/ref/models/fields/#field-types 这里可以查看完整的字段类型

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据挖掘DT机器学习

Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录

Python 2.7 IDE Pycharm 5.0.3 Firefox浏览器:47.0.1 PIL : Pillow-3.3.0-cp27-cp27m-...

4238
来自专栏张善友的专栏

Entity Framework Code First 支持存储过程

存储过程(Stored Procedure)不仅仅是将多得简直荒唐的业务逻辑塞入数据库的一种方式;它还是避免将多得简直荒唐的存储逻辑塞入应用程序层(applic...

1788
来自专栏数据和云

当Java虚拟机遇上Linux Arena内存池

作者简介 刘韬,云和恩墨中间件服务交付团队专家 Java开发出身,10年WebLogic相关开发、运维工作经验,熟悉SOA、现代业务系统架构中各层组件,尤其擅长...

4857
来自专栏游戏开发那些事

【python游戏编程之旅】第五篇---嗷大喵爱吃鱼小游戏开发实例

本系列博客介绍以python+pygame库进行小游戏的开发。有写的不对之处还望各位海涵。

732
来自专栏程序人生

数据的存储

这是我今年一月份在 team 内部的一次分享。介绍了主流的数据存储方案,包括:内存,文件,数据库和消息队列,以及数据序列化/反序列化的方法。很多时候,工具就在那...

3486
来自专栏用户2442861的专栏

使用ffmpeg转换文件格式,及ffmpeg参数说明(转)

转换文件test.avi到test.flv ffmpeg -i test.avi -ab 56 -ar 22050 -b 500 -r 29.97 -s 3...

1221
来自专栏文渊之博

数据库压缩备份提高备份效率

背景     在数据库的备份过程中有很多参数,前几日发现公司的备份数据库job运行的很慢,就去研究了一下,发现在备份程序中都没有启用压缩,加上压缩以后有发现效率...

1729
来自专栏皮振伟的专栏

[linux][kernel]meltdown攻击和retpoline防御分析

前言: Intel爆出来的漏洞,搞了一个大新闻,然后Linus也对Intel的补丁批判了一番。 关于meltdown攻击的原理,以及retpoline防御,见下...

3726
来自专栏生信宝典

生信宝典之傻瓜式 (五) - 文献挖掘查找指定基因调控网络

如何快速查找指定基因的调控网络介绍了使用在线查询数据库 (http://evexdb.org/)对PubMed和PubMed Central中发表文章的摘要和全...

1999
来自专栏何俊林

MediaCodec进行音频合成

2183

扫码关注云+社区