============== 模型(Models) ============== .. module:: django.db.models 在 Django 应用当中, model 是唯一的数据来源。它包含必需的字段和用以保存数据的行为。通常情况 下,一个 model 映射一个数据表。 基础: * 每个 model 都是一个继承自 :class:`django.db.models.Model` 类的子类。 * model 的每个属性都表示数据库中的一个字段。 * Django 会提供一套自动生成的用于数据库访问的API;详见 :doc:`/topics/db/queries` 。 入门例子 ======== 这个例子定义了一个 ``Person`` model,它有 ``first_name`` 和 ``last_name`` 两个属性 :: from django.db import models class Person(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) ``first_name`` 和 ``last_name`` 是model的 字段-Fields_ 。 每个字段都被指定成一个类属性,每个属性 都映射一个数据库的列。 上面的 ``Person`` model 会在数据库中创建这样一张表: .. code-block:: sql CREATE TABLE myapp_person ( "id" serial NOT NULL PRIMARY KEY, "first_name" varchar(30) NOT NULL, "last_name" varchar(30) NOT NULL ); 一些技术上的注意事项: * 这个表的名称 ``myapp_person`` ,是根据 model 中的元数据自动生成的,也可以覆写为别的名称, 详见 :ref:`table-names` * ``id`` 字段是自动添加的,但这个行为可以被重写。详见 :ref:`automatic-primary-key-fields` 。 * 这个例子使用 PostgreSQL 语法格式化 ``CREATE TABLE`` SQL 语句,要注意的是 Django 是根据 :doc:`settings file ` 配置中指定的数据库类型来生成相应的 SQL 语句。 使用模型(models) ================ 一旦你定义了 model ,就要通知 Django *启用* 这些 model ,你要做的就是修改配置文件中的 :setting:`INSTALLED_APPS` 设置,在其中添加 ``models.py`` 所在应用的名称。 例如,假设你的 model 定义在 ``mysite.myapp.models`` 中 ( mysite 这个包是由 :djadmin:`manage.py startapp ` 脚本创建的),那么 :setting:`INSTALLED_APPS` 就应该 包含下面内容:: INSTALLED_APPS = ( #... 'mysite.myapp', #... ) 在 :setting:`INSTALLED_APPS` 中添加新应用(app)后,要运行 :djadmin:`manage.py syncdb ` 同步数据库。 字段-Fields =========== model 中不可或缺且最为重要的,就是一系列的字段(fields),它是一组数据库字段的列表。字段由类 属性指定。 例如:: class Musician(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) instrument = models.CharField(max_length=100) class Album(models.Model): artist = models.ForeignKey(Musician) name = models.CharField(max_length=100) release_date = models.DateField() num_stars = models.IntegerField() 字段类型(Field types) --------------------- model 中的每个字段都是 :class:`~django.db.models.Field` 子类的某个实例。Django 根据字段类的 类型确定以下内容: * 数据库当中的列类型 (比如 ``INTEGER``, ``VARCHAR``)。 * Django 的用户管理界面所使用的部件( :doc:`widget ` )。当然,前提是你启 用了 Django 的管理后台并使用了某些部件 (例如, ```` , ``