python django框架学习笔记(二)--mtv开发模式

一、django的MTV模式

  django的MTV模式本质上和MVA一样,为了各组件间保持松耦合关系,只是定义上有些不同。

  M代表模型(Model):负责业务对象和数据库的关系映射(ORM)

  T代表模版(Template):负责如何把页面展示给用户(html)

  V代表视图(VIEW):负责业务逻辑,并在适当时候嗲用Model和Template.

  除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的VIEW处理,VIEW再调用相应的Model和Template.

    

  MTV模式处理情况大致如下:

  1、web服务器(中间件)收到一个http请求。

  2、Django在URLconf里查找对应的视图(view)函数来处理http请求。

  3、视图函数调用相应的数据模型来存取数据、调用相应的模版向用户展示页面

  4、视图函数处理结束后返回一个http的响应给WEB服务器

  5、WEB服务器将响应发送 给客户端。

  django中 MTV对应的文件组织:

  


 

二、url.py详解:

  url.py:URL分发器(路由配置文件)。

  1、urlpatterns:

  

  2、URL模式:

  urlpatterns = [

  url(正则表达式,view函数,参数,别名,前缀)

  ]

  参数说明:

  一个正则表达式字符串

  一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串

  可选的要传递给视图函数的默认参数(字典格式)

  一个可选的name参数

  路径前缀

  3、URL分解器,include函数:

  通常一个URL分解器对应一个URL配置模块,他可以包含多个URL模式,也可以包含多个其他URL分解器。通过这种包含结构设计,实现Django对URL的层级解析。

  url分解器是Django实现APP与项目解耦的关键,通常由include方法操作的url配置模块,最终会被解释成为URL分解器。

  4、URL常见写法实例,正则表达式

   url(r'^test/\d{2}/$',views.test)

  url(r'^test/(?P<id>\d{2})/$',view.test)

  url(r'^test2/(?P<id>\d{2})/(?P<key>\w+)/$',view.test)

 


三、views.py

  

   http请求:HttpRequest

   http响应:HttpResponse

  

  

  

  

     所在位置:django.http

  (1)、HttpRequest:具体方法请查看手册

  (2)、HttpResponse:具体方法请查看手册

  对于HttpRequest对象来说,是由Django自动创建,但是HttpResponse对象必须我们自己创建。每个View方法必须返回一个HttpResponse对象

  HttpResponse类在django.http.HttpResponse

  构造HttpResponse: 

response = HttpResponse("Here's the text of the web page.")
response = HttpResponse("Text only,please",,mimetype="text/plain")

 


四、数据库配置

   django默认支持sqlite、mysql、oracle、postgresql数据库。具体见:https://docs.djangoproject.com/en/1.9/ref/databases/

  这里我们还是以mysql为主,引擎名称:django.db.backends.mysql

  mysql驱动程序:

  MySQLdb(mysql-python):http://pypi.python.org/pypi/MySQL-pysthon/1.2.5 

  mysqlclient:http://pypi.python.org/pypi/mysqlclient

  Connector/Python:http://dev.mysql.com/downloads/connector/python

  PyMySQL(纯python的mysql驱动):http://pypi.python.org/pypi/PyMySQL

  pymysql使用:

  1、安装pymysql

  2、修改配置文件

       在settings.py中配置

DATABASES = {
      'default': {
          'ENGINE': 'django.db.backends.mysql',
          'NAME': 'django_db',
          'USER':'root',
          'PASSWORD':'123456',
          'HOST':'localhost',
          'PORT':'3306'


      }
  }

  3、在工程目录的__init__.py中增加代码:

import pymysql
pymysql.install_as_MySQLdb()

  4、OK,我们在mysql中新建我们指定的库,然后回来同步下数据库。在pycharm中Tools下运行:

  

  

  OK,查看数据库,我们的数据库同步完成。

  

 


 五、ORM

  对象关系映射(ORM),用于实现面对独享编程语言里不同类型系统的数据之间的转换。采用面对对象方式去操作数据库的创建表、增加、修改、删除、查询等操作。

 


六、models.py - 模型类的定义 

  一、创建数据模型。 

#coding:utf-8
from __future__ import unicode_literals
from django.db import models
from django.db import models

# Create your models here.

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):
    name = models.CharField(max_length=30)

class AuthorDetail(models.Model):
    sex = models.BooleanField(max_length=1,choices=((0,''),(1,''),))
    email =models.EmailField()
    address = models.CharField(max_length = 50)
    birthday = models.DateField()
    author = models.OneToOneField(Author)

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()

 

  我们来看看上面的代码:

  1、每个数据模型都是django.db.models.Model的子类。它的父类Model包含了所有的必要的和数据库交互的方法,并提供了一个简洁漂亮的定义数据库字段的语法。

  2、每个模型相当于旦哥数据表库()这条规则的例外情况是多对多的关系,多对多关系的时候会多生成一张关系表),每个属性也是这个表中的一个字段。属性名就是字段名,它的类型(例如:CharField)相当于数据库的字段类型(例如:varchar). 大家可以留意其他的类型都和数据库里面什么字段类型对应。

  

  3、模型之间的三种关系:一对一(OneToOneField),一对多(ForeignKey)和多对多(ManyToManyField).

  

  4、模型的常用字段类型

  BooleanField:布尔类型字段

  CharField:字符串类型字段

  DateField:日期字段

  DateTimeField:日期时间字段

  DecimalField:(精确)小数字段

  EmailField:文件字段(保存和处理上传的文件)

  FileField:文件字段

  FloatField:(浮点数)小数字段

  ImageField:图片字段(保存和处理上传的图片)

  IntegerField:整数字段

  IPAddreessField:IP字段

  SmallIntegerField:小整数字段

  TextField:文本字段

  URLField:网页地址字段

  

  5、模型常用的字段选项

  (1)、null(null = True|False)

  数据库字段的设置是否可以为空(数据库进行验证)

  (2)、blank(blank = True|False)

  字段是否为空django会进行校验(表单进行验证)

   (3)、choices :轻量级的配置字段可选属性的定义

   (4)、default :字段的默认值

   (5)、help_text:字段文字帮助

    ( 6 )、primary_key(=True|False)一般情况不需要进行定义是否主键,如果没有显示指定主键的话,django会自动增加一个默认主键 id = models.AutoField(primary_key=Ture)

    (7)、unique:是否唯一,对于数据表而已

     ( 8 )、verbose_name:字段的详细民称,如果不指定该属性,默认使用字段的属性名称

  官方文档:https://docs.djangoproject.com/en/1.9/ref/models/fields/

  二、定义数据模型的扩展属性

   通过内部类Meta给数据模型类增加扩展属性:

   class Meta:

    verbose_name = ‘名称’

    verbose_name_plural = '名称复数形式'

    odering = ['排序字段']

    更多:https://docs.djangoproject.com/en/1.9/ref/models/options

   三、定义模型的方法

   定义模型的方法和普通python类方法没有太大差别,定义模型方法可以将前对应的数据,组装成具体的业务逻辑。  

   定义__unicode__()让对象有个默认的名字

  (python2用__unicode__(),python3用__str__())  

def __str__(self):
    return self.name

 

posted @ 2016-11-16 16:52  前进的卒子  阅读(439)  评论(0编辑  收藏  举报