《The Django Book》学习笔记
把数据存取逻辑、表现逻辑和业务逻辑组合在一起的概念被称为软件架构的 Model-View-Controller (MVC)模式。 在这个模式中, Model 代表数据存取层,View 代表的是系统中选择显示什么和怎么显示的部分,Controller 指的是系统中根据用户输入并视需要访问模型,以决定使用哪个视图的那部分。
Django中主要处理模型(Model)、模板(Template)和视图(Views),C由框架自行处理,所以也叫MTV框架,在 MTV 开发模式中:
- M 代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
- T 代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
- V 代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。
数据库配置
- 数据库的安装和数据库驱动安装(这里选择的是mysql和python-mysql)
- 数据库配置也是在Django的配置文件里,缺省 是 settings.py,设置如下:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 'NAME': 'mydb', # Or path to database file if using sqlite3. # The following settings are not used with sqlite3: 'USER': 'username', 'PASSWORD': 'passwd', 'HOST': '', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP. 'PORT': '', # Set to empty string for default. } }
- 检查数据库配置是否正确
# python manage.py shell命令进入交互界面 >>> from django.db import connection >>> cursor = connection.cursor() #如果没有显示什么错误信息,那么你的数据库配置是正确的
创建app
在之前我们已经创建了 project , 那么 project 和 app 之间到底有什么不同呢?它们的区别就是一个是配置另一个是代码:
- 一个project包含很多个Django app以及对它们的配置。一个app是一套Django功能的集合,通常包括模型和视图,按Python的包结构的方式存在。
- 技术上,project的作用是提供配置文件,比方说哪里定义数据库连接信息, 安装的app列表,TEMPLATE_DIRS ,等等。
- Django本身内建有一些app,例如注释系统和自动管理界面。 app的一个关键点是它们是很容易移植到其他project和被多个project复用。
- 如果使用了Django的数据库层(模型),就必须创建一个Django app
python manage.py startapp books #次命令在mysite目录下建立了一个目录books ls ~/djcodes/mysite/books #显示目录下的文件:__init__.py models.py tests.py views.py
第一个模型
第一步是用Python代码来描述它们。 打开由`` startapp`` 命令创建的models.py 并输入下面的内容:from django.db import models
class Publisher(models.Model): #每个数据模型都是 django.db.models.Model 的子类。创建Publisher模型 name = models.CharField(max_length=30) #类型CharField相当于SQL中的varchar 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()
def __unicode__(self): #将对象以unicode方式显示出来,一下两个省略不写,请自行补上
return self.name
class Meta: #内嵌类,设置一些与特定模型相关的选项,此处设定显示的默认排序方式,同下
ordering = ['name']
class Author(models.Model): #创建Author模型 first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=40) email = models.EmailField() class Book(models.Model): #创建Book模型 title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) #多对多 publisher = models.ForeignKey(Publisher) publication_date = models.DateField() #最后需要注意的是,我们并没有显式地为这些模型定义任何主键。 除非你单独指明,否则Django会自动为每个模型生成一个自增长的整数主键字段每个Django模型都要求有单独的主键:id
模型安装
完成模型的创建之后,让我们来在数据库中创建这些表。第一步是在 Django 项目中激活这些模型。 将 books app 添加到配置文件的已安装应用列表中即可完成此步骤。
编辑 settings.py 文件, 找到 INSTALLED_APPS 设置
MIDDLEWARE_CLASSES = ( #'django.middleware.common.CommonMiddleware', #'django.contrib.sessions.middleware.SessionMiddleware', #'django.middleware.csrf.CsrfViewMiddleware', #'django.contrib.auth.middleware.AuthenticationMiddleware', #'django.contrib.messages.middleware.MessageMiddleware', #此处五项依赖下面注释掉的五项,为避免错误,此处将其也注释掉 # Uncomment the next line for simple clickjacking protection: # 'django.middleware.clickjacking.XFrameOptionsMiddleware', ) INSTALLED_APPS = ( #'django.contrib.auth', #'django.contrib.contenttypes', #'django.contrib.sessions', #'django.contrib.sites', #'django.contrib.messages', #'django.contrib.staticfiles', #前五项是默认设置的条目,在这里我们将它们临时注释掉,以后再讨论 # Uncomment the next line to enable the admin: # 'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', 'books', #亦即~/djcodes/mysite/books )
设置好之后检验配置是否正确:python manage.py validate
模型没有错误,使用命令生成 CREATE TABLE 语句:python manage.py sqlall books。sqlall 命令并没有在数据库中真正创建数据表,只是把SQL语句段打印出来。
同步到数据库:python manage.py syncdb。syncdb命令只会提交新的app到数据库,如果你想修改或删除模型,syncdb不会做任何改变。需要使用其他方法
!创建数据实例与编辑数据库
>>> from books.models import Publisher >>> p = Publisher(name='Apress', ... address='2855 Telegraph Ave.', ... city='Berkeley', ... state_province='CA', ... country='U.S.A.', ... website='http://www.apress.com/') >>> p.save() #第一次save是插入,之后save是修改 >>> Publisher.objects.all() #all方法返回一个QuerySet 对象, 这个对象是数据库中一些记录的集合 >>> Publisher.objects.filter(name='Apress') #此处是精确匹配 >>> Publisher.objects.filter(name__contains="press") #双下划线表示魔术操作,其他的一些查找类型有:icontains(大小写无关),startswith和endswith, 还有range(BETWEEN) >>> Publisher.objects.get(name="Apress") #filter返回记录列表,get返回单个对象,如果结果是多个对象或没有匹配对象则会抛出异常 >>> Publisher.objects.order_by("name") #数据排序,可以指定多字段,也可以在定义Publisher模板时指定默认排序方式 >>>Publisher.objects.filter(country="U.S.A.").order_by("-name") #连锁查询 >>> Publisher.objects.order_by('name')[0:2] #对返回数据限制条件,不支持负索引 >>> Publisher.objects.filter(id=52).update(name='Apress Publishing') #更新对象 >>> Publisher.objects.filter(country='USA').delete() #删除对象
主要参考《the django book》