===============
Model API参考
===============
:作者: Django 团队
:译者: weizhong2004@gmail.com
:翻译开始日期: 2006-04-06
:翻译完成日期: 2006-04-06
:最后修订日期: 2006-05-06
:原文版本: 2800
一个 model 就是一个你要处理的数据的源代码形式表现的原型.
通常,一个 model 对应一个表. (数据库中的表). 它包含你要储存的数据的一些基础字段及其行为.
基本概念:
* 每个 model 都是一个 ``django.db.models.Model`` 类或它的子类 .
* model 的每个属性表示一个字段
* Model 元数据 (非字段信息) 保存在一个名为 ``Meta`` 的内嵌类中.
* 用于 admin site 的元数据保存在名为 ``Admin`` 的内嵌类中.
* Django 自动生成一系列数据访问 API, 关于该API的详情,参阅 `Database API reference`_.
本文档的详细解释见 `official repository of model examples`_.
.. _Database API reference: http://www.djangoproject.com/documentation/db_api/
.. _official repository of model examples: http://www.djangoproject.com/documentation/models/
快速示例
=============
本例子中定义了一个 ``Person``, 它拥有一个 ``first_name`` 和一个 ``last_name``::
from django.db import models
class Person(models.Model):
first_name = models.CharField(maxlength=30)
last_name = models.CharField(maxlength=30)
``first_name`` 和 ``last_name`` 是该 model 的 *字段* .这些字段以类属性的形式定义在 model 中,对应着数据库表的一个列.
上面定义的 ``Person`` 模型会创建下面这样一个 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``, 根据某些模型元数据自动生成,也可以被覆盖. 参阅下文中的 _`Table names` .
* 一个 ``id`` 字段被自动添加到表中, 这个行为也是可以被覆盖的.参阅下文中的 _`Automatic primary key fields` .
* 这里示例的 ``CREATE TABLE`` 语句是 PostgreSQL 语法格式. Django 会根据 配置文件_ 中定义的后端数据库引擎自动生成合适的SQL语句.
.. _配置文件: http://www.djangoproject.com/documentation/settings/
字段
======
一个模型最重要的部分--也是唯一必需的部分--就是定义的数据库字段列表. 字段以类属性的形式定义.
示例::
class Musician(models.Model):
first_name = models.CharField(maxlength=50)
last_name = models.CharField(maxlength=50)
instrument = models.CharField(maxlength=100)
class Album(models.Model):
artist = models.ForeignKey(Musician)
name = models.CharField(maxlength=100)
release_date = models.DateField()
num_stars = models.IntegerField()
字段名限制
-----------------------
Django 对模型的字段名仅有两个小小的限制:
1. 字段名不能是 Python 保留字, 否则显然会导致 Python 语法错误::
class Example(models.Model):
pass = models.IntegerField() # 'pass' is a reserved word!
2. 字段名中至多只允许有一个下划线, 否则 Django 查询语法就会出错::
class Example(models.Model):
foo__bar = models.IntegerField() 'foo__bar' has two underscores!
Django允许模型中使用的字段名可以与数据库中实际使用的不同,因此这些限制其实也不是绝对的.参阅下文中的 `db_column`_ .
SQL 保留字,比如 ``join``, ``where`` 或 ``select``, *都* 允许在模型字段名中使用( Django 在生成SQL语句时会给表名及字段名加上引号,从而保证SQL语句的正确执行).
字段类型
-----------
你的 model 中的每个字段都必须是相关 ``Field`` 类的实例. Django 使用该字段的 class types 来得到以下信息:
* 数据库的列类型(e.g. ``INTEGER``, ``VARCHAR``).
* Django 的 admin 要使用的控件类型 (e.g. ````, ``