1.MTV模式

Django 里关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架 。在 MTV 开发模式中:

  • M 代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。

  • T 代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。

  • V 代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。


2. 数据库配置

数据库的配置文件

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # Django使用哪个数据库引擎
        'NAME': '******',                      # 将数据库名称告知 Django
        'USER': 'root',                        # 告诉 Django 用哪个用户连接数据库
        'PASSWORD': '*********',               # 告诉Django连接用户的密码
        'HOST': '127.0.0.1',                   # 告诉 Django 连接哪一台主机的数据库服务器
        'PORT': '3306',                        # 端口号
    }
}


wKioL1VoM9XSTH6oAAK89hPw39c306.jpg


3. 创建应用程序

在`` mysite`` 项目文件下输入下面的命令来创建`` books`` app:


python manage.py startapp books


这个命令在mysite目录下创建了一个books目录。这个目录包含:

books/
    __init__.py
    models.py
    tests.py
    views.py


在Python代码里定义模型


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


这里使用MySQL数据库,首先,在MySQL中创建数据库: CREATE DATABASE books


在这个数据库中,有 书籍/作者/出版商 三张表。这三张表的概念,字段,关系如下:

  • 一个作者有姓,有名及email地址。

  • 出版商有名称,地址,所在城市、省,国家,网站。

  • 书籍有书名和出版日期。 它有一个或多个作者(和作者是多对多的关联关系[many-to-many]), 只有一
    个出版商(和出版商是一对多的关联关系[one-to-many],也被称作外键[foreign key])


打开books文件夹下的models.py。添加如下代码:

# coding=utf-8
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()

    def __unicode__(self):
        return self.name


class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField()

    def __unicode__(self):
        return u'%s %s' % (self.first_name, self.last_name)


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

    def __unicode__(self):
        return self.title


这些代码相当于SQL语句的CREATE TABLE XXX.....



模型安装


现在需要在数据库中创建表。首先在 Django 项目中 激活这些模型。 将 books app 添加到配置文件的已安装应用列表中即可完成此步骤。

再次编辑 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',
    'books', # 应用名称
)


用虾米的命令验证模型的有效性:



python manage.py validate


如果模型正确:

wKiom1VoeJKwIzG5AAA0QDMnJZ8112.jpg

运行下面的命令来生成 CREATE TABLE 语句


python manage.py sqlall books


在这个命令行中, books 是app的名称。 和你运行 manage.py startapp 中的一样


用下面语句同步数据库:


python manage.py syncdb


执行成功之后,在数据库中用SHOW TABLES,查看同步结果:

wKiom1VofVrD36TtAAB4A459boU650.jpg


基本数据访问


创建了模型,Django自动为这些模型提供了高级的Python API。 运行 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: Apress>, <Publisher: O'Reilly>]


我们把Django中的方法与对应的SQL语句做对比:

方法DjangoSQL
插入数据
>>> p = Publisher(name='Apress',
... address='2855 Telegraph Ave.',
... city='Berkeley',
... state_province='CA',
... country='U.S.A.',
... website='http://www.apress.com/') 
# >>> p.save()


INSERT INTO books_publisher
(name, address, city, state_province, country, website)
VALUES
('Apress', '2855 Telegraph Ave.', 'Berkeley', 'CA',
'U.S.A.', 'http://www.apress.com/');


更新数据
>>> p.id
52 # this will differ based on your own data
>>> p.name = 'Apress Publishing'
>>> p.save()
UPDATE books_publisher SET
name = 'Apress Publishing'
WHERE id=52;
选择对象
>>> Publisher.objects.all()
[<Publisher: Apress>, <Publisher: O'Reilly>]
>>> Publisher.objects.all()
[<Publisher: Apress>, <Publisher: O'Reilly>]
数据过滤
>>> Publisher.objects.filter(name='Apress')
[<Publisher: Apress>]


SELECT id, name, address, city, state_province, country, website
FROM books_publisher
WHERE name = 'Apress';
获取单个对象
>>> Publisher.objects.get(name="Apress")
<Publisher: Apress>

数据排序
>>> Publisher.objects.order_by("name") 
[<Publisher: Apress>, <Publisher: O'Reilly>]

# 若是逆向排序,则写为
#>>> Publisher.objects.order_by("‐name")
#[<Publisher: O'Reilly>, <Publisher: Apress>]
SELECT id, name, address, city, state_province, country, website
FROM books_publisher
ORDER BY name;
连锁查询
>>> Publisher.objects.filter(country="U.S.A.").order_by("‐name")
[<Publisher: O'Reilly>, <Publisher: Apress>]
SELECT id, name, address, city, state_province, country, website
FROM books_publisher
WHERE country = 'U.S.A'
ORDER BY name DESC;
限制返回的数据
>>> Publisher.objects.order_by('name')[0]
<Publisher: Apress>




>>> Publisher.objects.order_by('name')[0:2]
SELECT id, name, address, city, state_province, country, website
FROM books_publisher
ORDER BY name
LIMIT 1;


SELECT id, name, address, city, state_province, country, website
FROM books_publisher
ORDER BY name
OFFSET 0 LIMIT 2;
更新多个对象
>>> p = Publisher.objects.get(name='Apress')
>>> p.name = 'Apress Publishing'
>>> p.save()
SELECT id, name, address, city, state_province, country, website
FROM books_publisher
WHERE name = 'Apress';
UPDATE books_publisher SET
name = 'Apress Publishing',
address = '2855 Telegraph Ave.',
city = 'Berkeley',
state_province = 'CA',
country = 'U.S.A.',
website = 'http://www.apress.com'
WHERE id = 52;
删除对象
>>> p = Publisher.objects.get(name="O'Reilly")
>>> p.delete()
>>> Publisher.objects.all()
[<Publisher: Apress Publishing>]

>>> Publisher.objects.all().delete() # 删除所有对象








笔记来自《Django中文教程》