Django学习笔记-4-模型

来源:互联网 发布:激光切割机编程教程 编辑:程序博客网 时间:2024/05/29 13:55

由于先天具备 Python 简单而强大的数据库查询执行方法,Django 非常适合开发数据库驱动网站。Django数据库层解决会对所使用的数据库服务器进行抽象,这样只在一处修改即可变换数据库服务器,避免因为数据库类型的变更而使用不同的数据库适配器,比如从Mysql更改到PostgreSQL。

Django 遵循 MVC 模式,可以称得上是一种 MVC 框架。 以下是 Django 中 M、V 和 C 各自的含义:

  • M ,数据存取部分,由django数据库层处理,本章要讲述的内容。

  • V ,选择显示哪些数据要显示以及怎样显示的部分,由视图和模板处理。

    2

  • C ,根据用户输入委派视图的部分,由 Django 框架根据 URLconf 设置,对给定 URL 调用适当的 Python 函数。

由于 C 由框架自行处理,而 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),所以 Django 也被称为 MTV 框架 。在 MTV 开发模式中:

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

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

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

数据库配置也是在Django的配置文件里,缺省是settings.py。默认配置如下:

DATABASES = {    'default': {        'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.        'NAME': '',                      # Or path to database file if using sqlite3.        # The following settings are not used with sqlite3:        'USER': '',        'PASSWORD': '',        'HOST': '',                      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.        'PORT': '9000',                      # Set to empty string for default.    }}

其中ENGINE选择数据库后需要安装对应的数据库适配器。

数据库连接正常后,便创建一个 Django app,即一个包含模型,视图和Django代码,并且形式为独立Python包的完整的Django应用。一个app是一套Django功能的集合,通常包括模型和视图,按Python的包结构的方式存在。系统对app有一个约定: 如果你使用了Django的数据库层(模型),你必须创建一个Django app。模型必须存放在apps中。因此,为了开始建造我们的模型,我们必须创建一个新的app。

在项目newtest下输入命令:python manage.py startapp books

即在newtest项目文件夹下创建了一个名为books的文件夹,则一个名为books的app就创建好了。

打开books目录下的modules.py,加入如下代码:

from django.db import modelsclass 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()

首先要注意的事是每个数据模型都是 django.db.models.Model的子类。它的父类 Model 包含了所有必要的和数据库交互的方法,并提供了一个简洁漂亮的定义数据库字段的语法。其中每个模型Publisher,Author,Book都相当于数据库表。每个属性也是这个表中的一个字段。 属性名就是字段名,它的类型(例如CharField )相当于数据库的字段类型 (例如 varchar )。最后需要注意的是,我们并没有显式地为这些模型定义任何主键。 除非你单独指明,否则Django会自动为每个模型生成一个自增长的整数主键字段每个Django模型都要求有单独的主键 id。

完成这些代码之后,现在让我们来在数据库中创建这些表。 要完成该项工作,第一步是在 Django 项目中 激活这些模型。 将 books app 添加到配置文件的已安装应用列表中即可完成此步骤。再次编辑 settings.py 文件, 找到 INSTALLED_APPS 设置。 INSTALLED_APPS 告诉 Django 项目哪些 app 处于激活状态。在INSTALLED_APPS中添加books,如下:

INSTALLED_APPS = (    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.sites',    'django.contrib.messages',    'django.contrib.staticfiles',    'books',    # Uncomment the next line to enable the admin:    # 'django.contrib.admin',    # Uncomment the next line to enable admin documentation:    # 'django.contrib.admindocs',)

用下面的命令验证模型的有效性:

python manage.py validate

validate 命令检查你的模型的语法和逻辑是否正确。 如果一切正常,你会看到 0 errors found 消息。

注意:

1. 教程说INSTALLED_APPS,MIDDLEWARE_CLASSES需要注释掉默认的条目,但是实验的时候实际上发现应该可以不用注释的。不会有影响。

2. 教程上说添加 'mysite.books',照此添加 'newtest.books',再运行以上命令,则会报错:ImportError: No module named books。只需要添加'books'即可。

在newtest 项目文件下输入下面的命令来创建app: books,命令如下:

python manage.py sqlall books

但是在此之前一定要完成以下步骤:首先需要安装Mysql server(其实不确定是否一定要安装server),然后在Mysql中新建一个database,取名为book。然后在settings.py中完成DATABASES部分:

DATABASES = {    'default': {        'ENGINE': 'django.db.backends.mysql', #'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.        'NAME': 'book',                      # Or path to database file if using sqlite3.        # The following settings are not used with sqlite3:        'USER': 'root',        'PASSWORD': 'root',        'HOST': '127.0.0.1',                      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.        'PORT': '3306',                      # Set to empty string for default.     }}

注意:PORT要为3306,否则会报错:OperationalError: (2003, "Can't connect to MySQL server on 'localhost' (10061)")。

运行完python manage.py sqlall books,输出如下:

BEGIN;CREATE TABLE `books_publisher` (    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,    `name` varchar(30) NOT NULL,    `address` varchar(50) NOT NULL,    `city` varchar(60) NOT NULL,    `state_province` varchar(30) NOT NULL,    `country` varchar(50) NOT NULL,    `website` varchar(200) NOT NULL);CREATE TABLE `books_author` (    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,    `first_name` varchar(30) NOT NULL,    `last_name` varchar(40) NOT NULL,    `email` varchar(75) NOT NULL);CREATE TABLE `books_book_authors` (    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,    `book_id` integer NOT NULL,    `author_id` integer NOT NULL,    UNIQUE (`book_id`, `author_id`));ALTER TABLE `books_book_authors` ADD CONSTRAINT `author_id_refs_id_1a0a2829` FOREIGN KEY (`author_id`) REFERENCES `books_author` (`id`);CREATE TABLE `books_book` (    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,    `title` varchar(100) NOT NULL,    `publisher_id` integer NOT NULL,    `publication_date` date NOT NULL);ALTER TABLE `books_book` ADD CONSTRAINT `publisher_id_refs_id_974c2a46` FOREIGNKEY (`publisher_id`) REFERENCES `books_publisher` (`id`);ALTER TABLE `books_book_authors` ADD CONSTRAINT `book_id_refs_id_0a3634f3` FOREIGN KEY (`book_id`) REFERENCES `books_book` (`id`);CREATE INDEX `books_book_81b79144` ON `books_book` (`publisher_id`);COMMIT;

检查数据库book,发现book数据库其实是空的。所以还需要执行命令:python manage.py syncdb,才能完成写进数据库的操作。之后可以发现数据库book里面有一些空的table了。如下:

+---------------------------------+
| Tables_in_book                    |
+---------------------------------+
| auth_group                          |
| auth_group_permissions       |
| auth_permission                   |
| auth_user                             |
| auth_user_groups                 |
| auth_user_user_permissions   |
| books_author                       |
| books_book                         |
| books_book_authors             |
| books_publisher                   |
| django_content_type             |
| django_session                     |
| django_site                           |
+----------------------------------+

syncdb 命令是同步你的模型到数据库的一个简单方法。 它会根据 INSTALLED_APPS 里设置的app来检查数据库, 如果表不存在,它就会创建它。 需要注意的是, syncdb 并不能将模型的修改或删除同步到数据库;如果你修改或删除了一个模型,并想把它提交到数据库,syncdb并不会做出任何处理。

(未完)