#前言部分来自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

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

 from django.db import models
from django import forms
# Create your models here. #球队模型
class Team(models.Model):
team_num = models.CharField(max_length=100) #球队编号
team_name = models.CharField(max_length=30) #球队名称
establish_data = models.DateTimeField() #成立时间
people_num = models.PositiveIntegerField() #人数
address_home = models.CharField(max_length=200) #主场地址
#球员 模型
class Player(models.Model):
player_name = models.CharField(max_length=30) #球员名称
player_card = models.CharField(max_length=30) #球员身份证
birth_data = models.DateTimeField() #出生日期
player_height = models.PositiveIntegerField() #球员身高
player_address = models.CharField(max_length=200)#家庭住址
player_phone = models.PositiveIntegerField() #球员手机号
player_email = models.EmailField()#邮箱
team = models.ForeignKey(Team,on_delete=models.CASCADE)#外键
#主教练 模型
class Coach(models.Model):
coach_name = models.CharField(max_length=30)#主教练名称
coach_card = models.CharField(max_length=20)
birth_data = models.DateTimeField()
certificate = models.ImageField()
coach_level = models.PositiveIntegerField()
coach_phone = models.PositiveIntegerField()
coach_email = models.EmailField()
team = models.ForeignKey(Team,on_delete=models.CASCADE) #外键
#雇主 模型
class Employer(models.Model):
employer_name = models.CharField(max_length=30)
employer_card = models.CharField(max_length=20)
team = models.ManyToManyField(Team) #定义多对多关系

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

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

Python Django框架笔记(五):模型的更多相关文章

  1. Python Django框架笔记(三):django工作方式简单说明和创建用户界面

    (一)  说明 简单说明下django的工作方式,并举2个例子. (二)  Django工作方式 假定我们有下面这些文件 ,这里在前2篇的基础上增加了 templates目录(存放html文件) 和s ...

  2. Python Django框架笔记(一):安装及创建项目

     #推荐一本书<Python核心编程>(适合有一定基础的),美国人Wesley Chun编写的,京东.淘宝应该都有.我是觉得写的很好,详细.简洁.满满的干货,不像有的书整本看完也没什么用. ...

  3. Python Django框架笔记(六):模板

    (一){%%}和{{ }} {% for post in posts %} <a href=""><h2>{{ post.title }}</h2&g ...

  4. Python Django框架笔记(二):创建应用和django 管理

    #前提是已经创建项目 (一)      创建应用 使用命令,在项目中创建一个应用(blog自定义) python manage.py startapp blog 创建完成后,可以看到下面几个文件 文件 ...

  5. Python Django框架笔记(四):数据分页和CSRF跨站点请求伪造

    (一)数据分页  可以参考  https://docs.djangoproject.com/en/2.0/topics/pagination/ 模板:如果只要显示 1.2.3.4.5.6....的话, ...

  6. [Python] Django框架入门

    说明:Django框架入门 当前项目环境:python3.5.django-1.11 项目名:test1 应用名:booktest 命令可简写为:python manager.py xxx => ...

  7. Django开发笔记五

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.页面继承 定义base.html: <!DOC ...

  8. 利用 Python django 框架 输入汉字,数字,字符,等。。转成二维码!

    利用 Python django 框架 输入汉字,数字,字符,等..转成二维码! 模块必备:Python环境 + pillow  + qrcode 模块 核心代码import qrcode qr = ...

  9. [Python] Django框架入门2——深入模型

    说明: 本文主要深入了解模型(models.py),涉及ORM简介.模型定义.模型成员.模型查询.自连接等.需要一定基础,可以先走一走基本入门流程. 附录一使用mysql数据库,附录二Django开发 ...

随机推荐

  1. 链表的反转、合并(不借助额外list数组)

    链表的基本操作:线性表 (单链表.循环链表-python实现) 反转链表: # -*- coding:utf-8 -*- class ListNode: def __init__(self, x): ...

  2. 在MongoDB中实现聚合函数

    在MongoDB中实现聚合函数 随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加. ...

  3. ActiveMQ新的Master/Slave存储共享机制Replicated LevelDB Store

    ActiveMQ新的Master/Slave存储共享机制Replicated LevelDB Store 使用ZooKeeper协调选择一个node作为master.被选择的master broker ...

  4. 全网最详细的CentOS7里安装MySQL时出现No package mysql-server available错误的解决办法(图文详解)

    不多说,直接上干货! 直接yum install mysql的话会报错,原因在于yum安装库里没有直接可以用的安装包,此时需要用到MariaDB了,MariaDB是MySQL社区开发的分支,也是一个增 ...

  5. java提供类与cglib包实现动态代理

    终于有点空余时间,决定把之前学习的知识点整理一下,备以后复习. 动态代理有三角色:抽象角色,代理角色,真是角色. 第一个记录下java提供的动态代理.即使用Proxy类和InvocationHande ...

  6. Golang数组Array

    数组Array 定义数组的格式:var [n], n>0 package main import ( "fmt" ) func main() { //数组的长度也是类型的一部 ...

  7. Python模板库Mako的用法

    官网地址:http://www.makotemplates.org/ 文档地址:http://docs.makotemplates.org/ 中文文档基本用法地址:http://www.open-op ...

  8. Deep learning with Python 学习笔记(5)

    本节讲深度学习用于文本和序列 用于处理序列的两种基本的深度学习算法分别是循环神经网络(recurrent neural network)和一维卷积神经网络(1D convnet) 与其他所有神经网络一 ...

  9. 【LeetCode题解】225_用队列实现栈(Implement-Stack-using-Queues)

    目录 描述 解法一:双队列,入快出慢 思路 入栈(push) 出栈(pop) 查看栈顶元素(peek) 是否为空(empty) Java 实现 Python 实现 解法二:双队列,入慢出快 思路 入栈 ...

  10. Spring基础(2):bean顺序创建

    public class Person{ public Person(){ System.out.println("Person person person ..."); } } ...