Django Web开发学习笔记(5)

时间:2022-09-17 14:45:24

第五部分 Model 层

创建一个app工程。app和project的区别引用DjangoBook的说法是:

一个project包含很多个Django app以及对它们的配置。

技术上,project的作用是提供配置文件,比方说哪里定义数据库连接信息, 安装的app列表, TEMPLATE_DIRS ,等等。

一个app是一套Django功能的集合,通常包括模型和视图,按Python的包结构的方式存在。

例如,Django本身内建有一些app,例如注释系统和自动管理界面。 app的一个关键点是它们是很容易移植到其他project和被多个project复用。

一、创建app包

python manage.py startapp yourappName [yourappDestination]

观察一下默认生成的文件的名字:

yourappName--------

--------__init__.py

--------admin.py

--------models.py

        --------tests.py

--------views.py

我们早些时候谈到。MTV里的M代表模型。 Django模型是用Python代码形式表述的数据在数据库中的定义。 对数据层来说它等同于 CREATE TABLE 语句,只不过执行的是Python代码而不是 SQL,而且还包含了比数据库字段定义更多的含义。 Django用模型在后台执行SQL代码并把结果用Python的数据结构来描述。 Django也使用模型来呈现SQL无法处理的高级概念。(DjangoBook)

自省(运行时自动识别数据库)会导致过载和有数据完整性问题。 为了提供方便的数据访问API, Django需要以 某种方式 知道数据库层内部信息,有两种实现方式。第一种方式是用Python明确地定义数据模型,第二种方式是通过自省来自动侦测识别数据模型。

第二种方式看起来更清晰,因为数据表信息只存放在一个地方-数据库里,但是会带来一些问题。 首先,运行时扫描数据库会带来严重的系统过载。 如果每个请求都要扫描数据库的表结构,或者即便是 服务启动时做一次都是会带来不能接受的系统过载。(有人认为这个程度的系统过载是可以接受的,而Django开发者的目标是尽可能地降低框架的系统过载)。第二,某些数据库,尤其是老版本的MySQL,并未完整存储那些精确的自省元数据。

编写Python代码是非常有趣的,保持用Python的方式思考会避免你的大脑在不同领域来回切换。 尽可能的保持在单一的编程环境/思想状态下可以帮助你提高生产率。 不得不去重复写SQL,再写Python代码,再写SQL,…,会让你头都要裂了。

把数据模型用代码的方式表述来让你可以容易对它们进行版本控制。 这样,你可以很容易了解数据层 的变动情况。

SQL只能描述特定类型的数据字段。 例如,大多数数据库都没有专用的字段类型来描述Email地址、URL。 而用Django的模型可以做到这一点。 好处就是高级的数据类型带来更高的效率和更好的代码复用。

SQL还有在不同数据库平台的兼容性问题。 发布Web应用的时候,使用Python模块描述数据库结构信息可以避免为MySQL, PostgreSQL, and SQLite编写不同的CREATE TABLE

二、创建模型

打开model.py并添加下面的语句:

from django.db import models

# Create your models here.
class Student(models.Model):
name = models.charField(max_length=30)
address = models.charField(max_length = 50)
city = models.charField(max_length=30)
grade = models.charField(max_length = 20)
website = models.URLField() class School(models.Model):
name = models.charField(max_length=30)
city = models.ManyToManyField(Student)
createDate = models.DateField()

这类似于SQL中创建表的语句。charField可以理解为数据库中的varchar()字段。另外需要注意的是表School中的几种特殊的数据结构:

ManyToManyField(Student).

“每个数据库表对应一个类”这条规则的例外情况是多对多关系。School有一个 多对多字段 叫做 Student 。 该字段表明一个学校可以有很多名的学生,Django创建了一个额外的表(多对多连接表)来处理这种映射关系。

最后需要注意的是,我们并没有显式地为这些模型定义任何主键。 除非你单独指明,否则Django会自动为每个模型生成一个自增长的整数主键字段每个Django模型都要求有单独的主键。也就是每条记录的id.

三、模型安装

我们创建完APP后,怎样将我们的APP与Project进行连接起来呢?上面我们看到,project的作用是提供配置文件,安装APP.因此我们可以猜到是放置在创建工程时自动生成的__setting__目录下面

再次编辑 settings.py 文件, 找到 INSTALLED_APPS 设置。 INSTALLED_APPS 告诉 Django 项目哪些 app 处于激活状态。

INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
)

我们在这个元组型数据中添加如下代码:

'DjangoE_1.formEtc"

下面我们就可以创建表了。在创建表之前我们应该先检查模型的有效性,执行

Python manage.py validate

执行结果为:0 error found 表明创建的模型是正确的

创建模型成功后,我们生成SQL表,执行

Python manage.py sqlall yourAppName

执行结果输出如下:

Django Web开发学习笔记(5)

我们可以看到,输出结构就是我们创建的模型的SQL语句形式。注意中间生成的school_city的映射表。就是我们上面提到的ManyToMany结构时生成的映射关系表。分别以school_id和student_id作为字段进行关联。

sqlall 命令并没有在数据库中真正创建数据表,只是把SQL语句段打印出来,这样你可以看到Django究竟会做些什么。 如果你想这么做的话,你可以把那些SQL语句复制到你的数据库客户端执行,或者通过Unix管道直接进行操作(例如,`` python manager.py sqlall books | psql mydb`` )。不过,Django提供了一种更为简易的提交SQL语句至数据库的方法: `` syncdb`` 命令

python manage.py syncdb

该命令会将你创建的SQL 语句同步到你的数据库中

Django Web开发学习笔记(5)

我们创建了数据库创建了一个超级用户。

四、数据的访问

执行命令:Python manage.py shell


2、在该命令下,我们可以利用Python语句对表进行增删查等任务,这些任务的完成都是Django提供的API完成的。如下:

import yourAppName.models as K

t1 = K.Student(name='ywc', city='Beijing',grade='Master')

t1.save()

t2=  K.Student(name='wcy', city='Beijing',grade='doctor')

t2.save()

这样我们就完成了对表的插入的任务,需要注意的是只有运行.save()的时候才能将数据插入成功

下面我们查看每条代码的执行结果:

Django Web开发学习笔记(5)

需要注意的是我们在对表进行初始化的时候并没有对表进行任何的操作,只有在进行save()的时候,我们才类似于执行了SQL中的INSERT语句,将初始化的数据插入到了表中

3、总结上面的操作,我们已经学习了表的创建、插入,下面我们学习选择,也就是过滤操作:

表名 + objects.filter(**)。类似于Where语句操作。

Django Web开发学习笔记(5)

4、删除对象

Django Web开发学习笔记(5)

如图所示:需要注意的是通过get方法返回的对象有多个事我们只能通过filter进行删除。貌似get方法只能获得单个对象。如果希望删除整个对象可以直接调用T.Student.objects.all().delete()函数

下一章我们介绍怎样对站点进行管理的操作!

Django Web开发学习笔记(5)的更多相关文章

  1. Django Web开发学习笔记(1)

    一.Python的标准类型 (1)bool型 >>> bool("") False >>> bool(None) False >>& ...

  2. Django Web开发学习笔记(3)

    1.创建一个简单视图 这章是按照DgangoBook的说明.在我们创建的工程目录下面DjangoE_1(这是我为自己的工程命名的名字)新建一个view.py的文件,并在该文件下添加如下代码 from ...

  3. Django Web开发学习笔记(4)

    第四章 模板篇 上一章的内容,我们将HTML的代码和Python代码都混合在了在view.py的文件下.但是这样做的坏处无疑是明显的,引用DjangoBook的说法: 对页面设计进行的任何改变都必须对 ...

  4. python的内存管理机制 图解+Django Web开发学习笔记

    http://www.cnblogs.com/CBDoctor/p/3781078.html http://www.cnblogs.com/vamei/p/3232088.html http://bl ...

  5. 【前端】移动端Web开发学习笔记【2】 & flex布局

    上一篇:移动端Web开发学习笔记[1] meta标签 width设置的是layout viewport 的宽度 initial-scale=1.0 自带 width=device-width 最佳实践 ...

  6. 【前端】移动端Web开发学习笔记【1】

    下一篇:移动端Web开发学习笔记[2] Part 1: 两篇重要的博客 有两篇翻译过来的博客值得一看: 两个viewport的故事(第一部分) 两个viewport的故事(第二部分) 这两篇博客探讨了 ...

  7. ASP.NET Core Web开发学习笔记-1介绍篇

    ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...

  8. Django Web开发指南笔记

    Django Web开发指南笔记 语句VS表达式 python代码由表达式和语句组成,由解释器负责执行. 主要区别:表达式是一个值,它的结果一定是一个python对象:如:12,1+2,int('12 ...

  9. PHP和MySQL Web开发学习笔记介绍

    前言 从2016年2月1日开始,之后的几个月左右的时间里,我会写一个系列的PHP和MySQL Web开发的学习笔记.我之前一直从事Java语言的开发工作,最近这段时间非常想学习一门语言,就选择了PHP ...

随机推荐

  1. NotSupportedException-无法将类型“System.DateTime”强制转换为类型“System.Object”

    几张图就可以说明一切 2015-03-29 21:54:09,206 [77] ERROR log - System.NotSupportedException: 无法将类型“System.DateT ...

  2. RPM安装命令总结--转载

    原地址:http://www.cnblogs.com/zqwang0929/p/3352237.html 在 Linux 操作系统下,几乎所有的软件均通过RPM 进行安装.卸载及管理等操作.RPM 的 ...

  3. 前端JS开发框架-DHTMLX--dhtmlXTree

    介绍 dhtmlxTree是一个功能丰富的JavaScript树菜单  它允许您快速添加一个好看的,基于ajax的web页面的分层树. treeview支持在线节点编辑.先进的拖放,三态复选框等等.由 ...

  4. SQL SERVER大话存储结构(4)_复合索引与包含索引

              索引这块从存储结构来分,有2大类,聚集索引和非聚集索引,而非聚集索引在堆表或者在聚集索引表都会对其 键值有所影响,这块可以详细查看本系列第二篇文章:SQL SERVER大话存储结构 ...

  5. Java Collections API和泛型

    Java Collections API和泛型 数据结构和算法 学会一门编程语言,你可以写出一些可以工作的代码用计算机来解决一些问题,然而想要优雅而高效的解决问题,就要学习数据结构和算法了.当然对数据 ...

  6. SCF: 简单配置门面[转]

    原文:https://blog.csdn.net/koqizhao/article/details/82178100 Simple Configuration Facade :简单配置门面  是 代码 ...

  7. python-->(set /dict)交集 差集 并集 补集(功能用来做交差并补的)

    # ### 集合 作用:交集 差集 并集 补集(功能用来做交差并补的) '''特征:自动去重 无序''' #定义一个空集合 setvar = set() #set()强制转换成一个空集合的数据类型 p ...

  8. python 删除2天前后缀为.log的文件

    python脚本 删除2天前后缀为.log的文件 #!/usr/local/python/bin/python #-*-coding=utf8 -*- import time import os,sy ...

  9. MySQL之安装以及辅助工具的安装

    一 下载地址 MySQL 下载地址: http://rj.baidu.com/soft/detail/12585.html?ald 客户端工具:MavicatforMySQL 绿色版下载地址:http ...

  10. 2018.09.01 loj#2330. 「清华集训 2017」榕树之心(树形dp)

    传送门 树形dp好题啊. 我们用w[i]" role="presentation" style="position: relative;">w[ ...