Django官方文档中文版-Model层

(本人大学英语四级及格水平,渣渣翻译,每天翻译半小时,有不对的地方还请留言指正)
(官方文档链接:https://docs.djangoproject.com/en/2.0/topics/db/models/)

Models

Model是你数据信息的唯一,确定的来源。它包含了基础字段(fields)和存储数据时的行为。总的来说,每一个Model都匹配一个数据表。

基础:

  • 每一个Model都是一个继承于django.db.models.Model的class
  • Model的每一个属性都代表着数据表中的一个字段
  • Django提供了一个自动生成的数据库访问的API,参见Making queries.

小栗子

这个model例子定义了一个Person类,包含first_namelast_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_namelast_name都是model的字段,并且也作为一个class的属性,每个属性同时也对应数据表中的一个列名。

上面的Person模型将会创建如下的数据表:

CREATE TABLE myapp_person (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL
);

一些提示:

  • 数据表的名称:myapp_person,是通过modelmetadata自动生成的,但是可以被重写。重写方法参见: Table names
  • id字段被自动添加,但是这些行为可以被重写。
    参见Automatic primary key fields
  • 本例中的CREATE TABLESQL语句使用的是PostgreSQL的语法进行格式化,但是值得注意的是Django使用的SQL语句是针对您设置文件中指定的后端数据库。
    配置文件:settings file

Using models

一旦你已经创建了你的models,你需要告诉Django你准备去使用这些models。把包含你model.py的模块(module)名称添加到配置文件(setting file)的INSTALLED_APPS中去,就可以使用这些model了。

例如,如果包含model.pyapp名称为myapp.modelsINSTALLED_APPS应该添加如下信息(app可以使用manage.pystartapp命令创建):

INSTALLED_APPS = [
    #...
    'myapp',
    #...
]

当你往INSTALLED_APPS中添加新app时,一定要运行 manage.py
migrate命令,在运行migrate命令前,可以选择运行manage.pymakemigrations命令。

Fields

一个model中最重要的部分,也是model中唯一需要的部分,就是它定义的一连串的数据库的字段。field由类属性指定。值得注意的是,字段名称选取时不要选择与model API冲突的名称,例如clean,save,delete等。
例子:

from django.db import models

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, on_delete=models.CASCADE)
#on_delete=models.CASCADE级联删除,当删除主表数据时,从表中的数据也一起删除
    name = models.CharField(max_length=100)
    release_date = models.DateField()
    num_stars = models.IntegerField()

Field类型(Field types)

model中的每一个field,都应该选择一个合适的Field类去实例化。Django使用field类的类型去完成一些东西:

  • 数据表列类型,它告诉数据库是什么类型的数据被存储。(例如:INTEGER,VARCHAR,TEXT)。
  • 一个缺省的HTML微件( widget)当渲染一个form的字段时。(例如:,