Django学习笔记(第五节)模型(1)
2015-05-08 22:16
337 查看
就像HTML可以硬编码在views.py中一样,Django的数据库操作也可以在views.py中进行。
由于在创建Django项目的时候会自动添加sqlite,所以这里以sqlite数据库为例:
Django致力于解决这样的问题:
在了解模型之前,我们先回顾一下MVC和MTV模式。
在这个模式中, Model 代表数据存取层,View 代表的是视图部分,Controller 指的是系统中根据用户输入并视需要访问模型,以决定使用哪个视图的那部分。
MVC模式有广泛的应用,从struts到android都使用了MVC模式。
Django中MVC模式的含义:
M ,数据存取部分,由django数据库层处理,本章要讲述的内容。
V ,选择显示哪些数据要显示以及怎样显示的部分,由视图和模板处理。
C ,根据用户输入委派视图的部分,由 Django 框架根据 URLconf 设置,对给定 URL 调用适当的 Python 函数。
由于 C 由框架自行处理,而 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架 。在 MTV 开发模式中:
M 代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
T 代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
V 代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。
打开setting.py,查找数据库配置:
如果使用的开发工具是eclipse+pydev,只需要右键你的poject-->Django-->Create Application(manage.py startapp),在弹出的对话框中数据你的app名称即可。
如果使用命令那么进入你的工程目录,输入命令:python manage.py startapp books
Django提供了实用工具来从现有的数据库表中自动扫描生成模型。 这对已有的数据库来说是非常快捷有用的。
一个作者有姓,有名及email地址。
出版商有名称,地址,所在城市、省,国家,网站。
书籍有书名和出版日期。 它有一个或多个作者(和作者是多对多的关联关系[many-to-many]), 只有一个出版商(和出版商是一对多的关联关系[one-to-many],也被称作外键[foreign key])
打开models.py文件,输入代码
在1.4教程中:
执行python manage.py validate命令检查模型的语法和逻辑是否正确。
然后执行python manage.py sqlall books命令,其中books是APP名称。
我使用的是Django1.7,如果执行这两个命令,会报importError:No module namede books
查看了一下官方文档,说是使用新命令python manage.py makemigrations books
据论坛网友亲测 1.6版本python manage.py sql books,1.8版本与1.7一致。
输入命令提示成功如下:
这时候刷新项目,发现books->migrations下多出来一个0001_initial.py的文件。里面就是一下创建的方法。
然后我执行了python
manage.py syncdb命令,在命令行中引导我设置了用户名密码和邮箱。
然后执行python
manage.py shell命令,输入代码:
需要注意到是,只有调用了save方法,数据才会真正保存到数据库。
当然也可以一步完成创建对象和保存到数据库的操作,只要使用Publisher.objects.create方法,参数写法与上例中的相同。
至此模型的创建,以及添加数据,读取数据都已经完成了。
由于在创建Django项目的时候会自动添加sqlite,所以这里以sqlite数据库为例:
def book_list(request): cursor = connection.cursor() cursor.execute('create table if no exits books (id integer primary key autoincrement , name varchar(60) )') cursor.execute('SELECT name FROM books ORDER BY name') names = [row[0] for row in cursor.fetchall()] cursor.close() return render_to_response('book_list.html', {'names':names})当我们一次次去连接数据库,编写sql,甚至是换数据库时,这种写法就非常不方便了。
Django致力于解决这样的问题:
from django.shortcuts import render_to_response from mysite.books.models import Book def book_list(request): books = Book.objects.order_by('name') return render_to_response('book_list.html', {'books': books})
在了解模型之前,我们先回顾一下MVC和MTV模式。
MTV 开发模式
Model-View-Controller (MVC)模式是把数据存取逻辑、业务逻辑和表现逻辑组合在一起的软件架构模式。在这个模式中, Model 代表数据存取层,View 代表的是视图部分,Controller 指的是系统中根据用户输入并视需要访问模型,以决定使用哪个视图的那部分。
MVC模式有广泛的应用,从struts到android都使用了MVC模式。
Django中MVC模式的含义:
M ,数据存取部分,由django数据库层处理,本章要讲述的内容。
V ,选择显示哪些数据要显示以及怎样显示的部分,由视图和模板处理。
C ,根据用户输入委派视图的部分,由 Django 框架根据 URLconf 设置,对给定 URL 调用适当的 Python 函数。
由于 C 由框架自行处理,而 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架 。在 MTV 开发模式中:
M 代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
T 代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
V 代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。
数据库配置
如果是使用sqlite的话就不需要进行数据库配置。其他数据库则需要进行配置。打开setting.py,查找数据库配置:
DATABASE_ENGINE = ''#Django使用的数据库引擎 DATABASE_NAME = ''#数据库名称 DATABASE_USER = ''#用户,sqlite空即可 DATABASE_PASSWORD = ''#密码,sqlite空 DATABASE_HOST = ''#数据库服务器主机地址,如果Django与数据库在同一台计算机上,可以保留空白 DATABASE_PORT = ''#主机端口例如如sqlite,则是以下配置:
# Database # https://docs.djangoproject.com/en/1.7/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
第一个应用程序
根据约定,如果使用Django数据库模型,就必须创建一个Django app。模型必须存放在apps中。如果使用的开发工具是eclipse+pydev,只需要右键你的poject-->Django-->Create Application(manage.py startapp),在弹出的对话框中数据你的app名称即可。
如果使用命令那么进入你的工程目录,输入命令:python manage.py startapp books
在Python代码里定义模型
在代码中定义模型也是有一些弊端的,如果你修改了一个Django模型, 你要自己来修改数据库来保证和模型同步。Django提供了实用工具来从现有的数据库表中自动扫描生成模型。 这对已有的数据库来说是非常快捷有用的。
第一个模型
我们来假定下面的这些概念、字段和关系:一个作者有姓,有名及email地址。
出版商有名称,地址,所在城市、省,国家,网站。
书籍有书名和出版日期。 它有一个或多个作者(和作者是多对多的关联关系[many-to-many]), 只有一个出版商(和出版商是一对多的关联关系[one-to-many],也被称作外键[foreign key])
打开models.py文件,输入代码
class Publisher(models.Model): name= models.CharField(max_length=30) address= models.CharField(max_length=50) city= models.CharField(max_length=60) state_province= models.CharField(max_length=30) country= models.CharField(max_length=50) website = models.URLField() class Author(models.Model): first_name= models.CharField(max_length=30) last_name= models.CharField(max_length=40) email=models.EmailField() class Book(models.Model): title=models.CharField(max_length=100) #多对多 authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField()这三个class实际上相当于创建了三张表。
模型安装
打开settings.py文件,找打INSTALLED_APPS,注释掉初始默认值,在结尾添加上『'mysite.books',』,注意结尾的逗号一定要有。在1.4教程中:
执行python manage.py validate命令检查模型的语法和逻辑是否正确。
然后执行python manage.py sqlall books命令,其中books是APP名称。
我使用的是Django1.7,如果执行这两个命令,会报importError:No module namede books
查看了一下官方文档,说是使用新命令python manage.py makemigrations books
据论坛网友亲测 1.6版本python manage.py sql books,1.8版本与1.7一致。
输入命令提示成功如下:
这时候刷新项目,发现books->migrations下多出来一个0001_initial.py的文件。里面就是一下创建的方法。
然后我执行了python
manage.py syncdb命令,在命令行中引导我设置了用户名密码和邮箱。
然后执行python
manage.py shell命令,输入代码:
>>> from books.models import Publisher >>> p1 = Publisher(name='Apress', address='2855 Telegraph Avenue', ... city='Berkeley', state_province='CA', country='U.S.A.', ... website='http://www.apress.com/') >>> p1.save() >>> p2 = Publisher(name="O'Reilly", address='10 Fawcett St.', ... city='Cambridge', state_province='MA', country='U.S.A.', ... website='http://www.oreilly.com/') >>> p2.save() >>> publisher_list = Publisher.objects.all() >>> publisher_list [<Publisher: Publisher object>, <Publisher: Publisher object>]这段代码的含义是导入Publisher类,设置p1的字段值,调用save方法保存到数据库。Publisher.objects.all()方法的底层实际是一个SQL的select语句。
需要注意到是,只有调用了save方法,数据才会真正保存到数据库。
当然也可以一步完成创建对象和保存到数据库的操作,只要使用Publisher.objects.create方法,参数写法与上例中的相同。
至此模型的创建,以及添加数据,读取数据都已经完成了。
相关文章推荐
- Django开发教程 第五节 模型
- django学习笔记(模型)
- Django模型系统——ORM校园管理系统代码
- Django模型的Field Types
- Django 模型系统(model)&ORM--进阶
- Django中模型Model添加JSON类型字段的方法
- python后台架构Django教程——数据模型Model
- Django - 模型(QuerySet API)
- django 1.8 官方文档翻译: 2-1-1 模型语法(初稿)
- 《Java与模式》学习笔记之八---原始模型模式(Prototype Pattern)
- python_Django之模板模型
- Python框架之Django学习笔记(三)
- Django模型修改及数据迁移
- 周志华《机器学习》学习笔记2--模型评估与选择
- 通过数据库对Django进行删除字段和删除模型的操作
- Django自定义模型(model)中的字段标签
- Django学习笔记 — 自定义User模型
- Django文档翻译:模型参考(Model Reference)
- Django 博客 - 2 创建数据库模型
- Django项目实践3 - Django模型(view-数据库)