python

开源服务端框架Django五:模型models

2020-04-14  本文已影响0人  IT前沿技术分享

——————————————————————
Django系列笔记:
一、开发环境搭建
二:添加第一个应用
三:配置Mysql数据库1
四:配置Mysql数据库2
五:模型models
……
——————————————————————
在《二:添加第一个应用》里有简单介绍了如何添加一个模型,由于模型非常重要,所以,这里再作详细介绍。

一、模型

模型是真实数据的简单明确的描述。它包含了储存的数据所必要的字段和行为。Django 遵循 DRY Principle 。它的目标是你只需要定义数据模型,然后其它的杂七杂八代码你都不用关心,它们会自动从模型生成。

模型迁移 - 举个例子,不像 Ruby On Rails,Django 的迁移代码是由你的模型文件自动生成的,它本质上是个历史记录,Django 可以用它来进行数据库的滚动更新,通过这种方式使其能够和当前的模型匹配。

二、创建模型

在 Django 里写一个数据库驱动的 Web 应用的第一步是定义模型 - 也就是数据库结构设计和附加的其它元数据。

在我们的 HelloDjango 应用中,需要创建模型:Article,它包括标题title、内容content和发布时间pub_time

这些概念可以通过一个 Python 类来描述。按照下面的例子来编辑 HelloDjango/models.py 文件:

class Article(models.Model):

    title = models.CharField(max_length=32, default='Title')

    content = models.TextField(null=True)

    pub_time = models.DateTimeField(auto_now_add=True)

每个模型被表示为 django.db.models.Model 类的子类。每个模型有许多类变量,它们都表示模型里的一个数据库字段。

Field

每个字段都是 Field 类的实例 - 比如,

这将告诉 Django 每个字段要处理的数据类型。

每个 Field 类实例变量的名字(例如 question_textpub_date )也是字段名,所以最好使用对机器友好的格式。你将会在 Python 代码里使用它们,而数据库会将它们作为列名。

你可以使用可选的选项来为 Field 定义一个人类可读的名字。这个功能在很多 Django 内部组成部分中都被使用了,而且作为文档的一部分。如果某个字段没有提供此名称,Django 将会使用对机器友好的名称,也就是变量名。在上面的例子中,我们只为 Question.pub_date 定义了对人类友好的名字。对于模型内的其它字段,它们的机器友好名也会被作为人类友好名使用。

定义某些 Field 类实例需要参数。例如 CharField 需要一个 max_length 参数。这个参数的用处不止于用来定义数据库结构,也用于验证数据,我们稍后将会看到这方面的内容。

Field 也能够接收多个可选参数;在上面的例子中:我们将 votesdefault 也就是默认值,设为0。

注意在最后,我们使用 ForeignKey 定义了一个关系。这将告诉 Django,每个 Choice 对象都关联到一个 Question 对象。Django 支持所有常用的数据库关系:多对一、多对多和一对一。

三、激活模型

上面的一小段用于创建模型的代码给了 Django 很多信息,通过这些信息,Django 可以:

但是首先得把 HelloDjango 应用安装到我们的项目里。

为了在我们的工程中包含这个应用,我们需要在配置类 INSTALLED_APPS 中添加设置。因为 HellodjangoConfig 类写在文件 Hellodjango/apps.py 中,所以它的点式路径是 'Hellodjango.apps.HellodjangoConfig'
所以,除了前面说到的方式,也可以将 mysite/settings.pyINSTALLED_APPS 子项添配置为点式路径:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'Hellodjango.apps.HellodjangoConfig',
]

现在你的 Django 项目会包含 HelloDjango 应用。接着运行下面的命令:

>$ python manage.py makemigrations HelloDjango

你将会看到类似于下面这样的输出:

>Migrations for 'HelloDjango':
  HelloDjango/migrations/0001_initial.py
    - Create model Article

如果没有更新则:

No changes detected in app 'HelloDjango'

通过运行 makemigrations 命令,Django 会检测你对模型文件的修改(在这种情况下,你已经取得了新的),并且把修改的部分储存为一次 迁移

迁移是 Django 对于模型定义(也就是你的数据库结构)的变化的储存形式 - 它们其实也只是一些你磁盘上的文件。如果你想的话,你可以阅读一下你模型的迁移数据,它被储存在 HelloDjango/migrations/0001_initial.py 里。别担心,你不需要每次都阅读迁移文件,但是它们被设计成人类可读的形式,这是为了便于你手动调整Django的修改方式。

Django 有一个自动执行数据库迁移并同步管理你的数据库结构的命令 - 这个命令是 migrate,我们马上就会接触它 - 但是首先,让我们看看迁移命令会执行哪些 SQL 语句。sqlmigrate 命令接收一个迁移的名称,然后返回对应的 SQL:

>$ python manage.py sqlmigrate HelloDjango 0001

你将会看到类似下面这样的输出(我把输出重组成了人类可读的格式):

--
-- Create model Article
--
CREATE TABLE `HelloDjango_article` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `title` varchar(32) NOT NULL, `content` longtext NULL, `pub_time` datetime(6) NOT NULL);

请注意以下几点:

如果你感兴趣,你也可以试试运行 python manage.py check ;这个命令帮助你检查项目中的问题,并且在检查过程中不会对数据库进行任何操作。

现在,再次运行 migrate 命令,在数据库里创建新定义的模型的数据表:

>$ python manage.py migrate
Operations to perform:
  Apply all migrations: HelloDjango, admin, auth, contenttypes, sessions
Running migrations:
  Applying HelloDjango.0001_initial... OK
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying sessions.0001_initial... OK

这个 migrate 命令选中所有还没有执行过的迁移(Django 通过在数据库中创建一个特殊的表 django_migrations 来跟踪执行过哪些迁移)并应用在数据库上 - 也就是将你对模型的更改同步到数据库结构上。

迁移是非常强大的功能,它能让你在开发过程中持续的改变数据库结构而不需要重新删除和创建表 - 它专注于使数据库平滑升级而不会丢失数据。我们会在后面的教程中更加深入的学习这部分内容,现在,你只需要记住,改变模型需要这三步:

数据库迁移被分解成生成和应用两个命令是为了让你能够在代码控制系统上提交迁移数据并使其能在多个应用里使用;这不仅仅会让开发更加简单,也给别的开发者和生产环境中的使用带来方便。

通过阅读文档 Django 后台文档 ,你可以获得关于 manage.py 工具的更多信息。

上一篇下一篇

猜你喜欢

热点阅读