Django 2.1.3 模型层 模型

模型

  • 1. 快速上手
  • 2. 使用模型
  • 3. 字段
    • 3.1 字段类型
    • 3.2 字段选项
    • 3.3 自动设置主键
    • 3.4 备注名
    • 3.5 关联关系
      • 3.5.1 多对一
      • 3.5.2 多对多
        • 多对多关系中额外字段
      • 3.5.3 一对一
    • 3.6 跨app引用模型
    • 3.7 字段名称限制
    • 3.8 自定义字段类型
  • 4.Meta选项
  • 5.模型属性
  • 6.模型方法
    • 6.1 覆盖预定义模型方法
    • 6.2 执行自定义SQL
  • 7.模型继承
    • 7.1 抽象基类
      • 7.1.1 Meta继承
      • 7.1.2 小心related_name和related_query_name
    • 7.2 多表继承
      • 7.2.1 Meta和多表继承
      • 7.2.2 继承和反向关系
      • 7.2.3 指定 parent_link 字段
    • 7.3 代理模型
      • 7.3.1 QuerySet仍然返回被请求的模型
      • 7.3.2 基类限制
      • 7.3.3 代理模型管理器
      • 7.3.4 代理继承和非托管模型之间的差异
  • 8. 多重继承
  • 9.不允许字段名称“隐藏”
  • 10.在包中组织模型

本章完


模型是您的数据唯一而且准确的信息来源。它包含您正在储存的数据的重要字段和行为。一般来说,每一个模型都映射一个数据库表。

基础:

  • 每个模型都是一个 Python 的类,这些类继承 django.db.models.Model
  • 模型类的每个属性都相当于一个数据库的字段。
  • 综上所说,Django 给你一个自动生成访问数据库的 API;请参阅 执行查询

1. 快速上手

这个样例模型定义了一个 Person类, 其拥有 first_namelast_name属性:
Django 2.1.3 模型层 模型_第1张图片
first_namelast_name模型的字段。每个字段都被指定为一个类属性,并且每个属性映射为一个数据库列。
上面的 Person 模型会创建一个如下的数据库表:
Django 2.1.3 模型层 模型_第2张图片
一些技术上的说明:

  • 该表的名称 “myapp_person” 是自动从某些模型元数据中派生出来,但可以被改写。有关更多详细信息,请参阅:表名
  • 一个 id 字段会被自动添加,但是这种行为可以被改写。请参阅:默认主键字段
  • 此例中的建表语句使用了PostgreSQL语法,但是值得注意的是Django使用的SQL语句跟你在配置文件中指定的数据库有关。

2. 使用模型

一旦你定义了你的模型,你需要告诉 Django 你准备使用这些模型。你需要修改设置文件中的 INSTALLED_APPS ,在这个设置中添加包含 models.py文件的模块的名字。

例如,如果模型位于你项目中的myapp.models中( 此包结构使用:python manage.py startapp命令创建),NSTALLED_APPS 应设置如下:
Django 2.1.3 模型层 模型_第3张图片
当你在INSTALLED_APPS配置新的app后,请记住按顺序执行manage.py makemigrationsmanage.py migrate这两条命令。


3. 字段

模型中最重要的、并且也是唯一需要指定的应用于数据库的字段定义。字段在类中定义。定义字段名时应小心避免使用与 models 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)
    name = models.CharField(max_length=100)
    release_date = models.DateField()
    num_stars = models.IntegerField()

3.1 字段类型

模型中每一个字段都应该是相应类的实例, Django 利用这些字段类来实现下面这些功能。

  • 字段类型用以指定数据库数据类型(如:INTEGER, VARCHAR, TEXT
  • 默认的HTML widgets,用来渲染form中的子部件(如: