模型层中模型的基本了解

模型简介

模型是你的数据的唯一的、确定的信息源。 它包含你所储存数据的必要字段和行为。 通常,每个模型对应数据库中唯一的一张表。

基础:

  • 每个模型都是一个Python类,它们都是django.db.models.Model的子类。
  • 每一个模型属性都代表数据库中的一个字段。

简单示例

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()

定义好模型之后,接下来你需要告诉Django这些模型。 你要做的就是修改配置文件中的INSTALLED_APPS设置,在其中添加model.py所在应用的名称。

例如,如果你的应用的模型位于app.models(由manage startapp app 命令自动创建的结构),INSTALLED_APPS部分看上去应该是:

INSTALLED_APPS = [
    #...
    ‘app.apps.AppConfig‘,
    #...
]

配置好模型之后,执行迁移命令,上面的Person模型会在数据库中创建这样一张表(如果不配置数据库,默认创建在django自带的sqlite3):

CREATE TABLE "app_person" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(12) NOT NULL, "age" integer NOT NULL);

一些技术上的注意事项:

  • 这个表的名称app_person,是根据模型中app的名称加类名的小写组合而成,也可以重写为别的名称
  • id字段是自动添加的,但这个行为可以被重写

字段类型

模型中的每个字段都是相应的Field类的实例。 Django根据Field的类型确定以下信息:

  • 列类型,它告知数据库要存储哪种数据(例如,INTEGER,VARCHAR,TEXT)。
  • 渲染表单时使用的默认HTML widget(例如,input type="text", select)。
  • 最低限度的验证需求,它被用在 Django 管理站点和自动生成的表单中。

常用字段

AutoField

自增的整形字段,必填参数primary_key=True,则成为数据库的主键。无该字段时,django自动创建。

一个model不能有两个AutoField字段。

IntegerField

一个整数类型。数值的范围是 -2147483648 ~ 2147483647。

CharField

字符类型,必须提供max_length参数。max_length表示字符的长度。

DateField

日期类型,日期格式为YYYY-MM-DD,相当于Python中的datetime.date的实例。

参数:

  • auto_now:每次修改时修改为当前日期时间。
  • auto_now_add:新创建对象时自动添加当前日期时间。

auto_now和auto_now_add和default参数是互斥的,不能同时设置。

DatetimeField

日期时间字段,格式为YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime的实例。

字段选项

每个字段都接受一组与字段有关的参数,例如,CharField需要max_length参数来指定VARCHAR数据库字段的大小。

常用字段选项

null

如果为True,Django将在数据库中把空值存储为NULL。 默认为False

blank

如果为True,该字段允许为空值, 默认为False。

要注意,这与null不同。null纯粹是数据库范畴,指数据库中字段内容是否允许为空,而blank是表单数据输入验证范畴的。 如果一个字段的blank=True,表单的验证将允许输入一个空值。 如果字段的blank=False,该字段就是必填的。

choices

由二项元组构成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,而且这个选择框的选项就是choices 中的选项。

这是一个关于 choices 列表的例子:

COURSE_CHOICES = (
    (1, ‘Python‘),
    (2, ‘Go‘),
    (3, ‘Linux‘),
)

每个元组中的第一个元素是将被存储在数据库中的值。 第二个元素将由django显示。 给定一个模型实例,可以使用get_foo_display()方法来访问选项字段的显示值。(foo为设置choices的字段名)

default

数据库中字段的默认值,如果自身传入了值,则使用传入的,没传则用默认的

verbose_name

Admin中显示的字段名称

primary_key

数据库中字段是否为主键

unique

如果为True, 则这个字段在整张表中必须是唯一的

关系

显然,关系数据库的威力体现在表之间的相互关联。 Django 提供了三种最常见的数据库关系:多对一(many-to-one),多对多(many-to-many),一对一(one-to-one)。

多对一

Django 使用django.db.models.ForeignKey定义多对一关系。 和使用其它Field类型一样:在模型当中把它做为一个类属性包含进来。

ForeignKey需要一个位置参数:与该模型关联的类。

建议你用被关联的模型的小写名称做为字段的名字,当然,你也可以起别的名字

多对多(如第三张表有额外需求,查阅官网手册)

ManyToManyField用来定义多对多关系, 和使用其它Field类型一样:在模型当中把它做为一个类属性包含进来。

ManyToManyField需要一个位置参数:和该模型关联的类。

建议你以被关联模型名称的复数形式做为ManyToManyField的名字

在哪个模型中设置ManyToManyField并不重要,在两个模型中任选一个即可 —— 不要两个模型都设置

一对一

OneToOneField用来定义一对一关系。 和使用其它Field类型一样:在模型当中把它做为一个类属性包含进来。

当某个对象想扩展自另一个对象时,最常用的方式就是在这个对象的主键上添加一对一关系。

OneToOneField要一个位置参数:与模型关联的类

Meta选项

使用内部的class Meta 定义模型的元数据

常见Meta选项

ordering   //排序选项
db_table   //数据库表名
verbose_name  //单数
verbose_name_plural //复数

模型属性

objects
模型最重要的属性是Manager。 它是Django 模型进行数据库查询操作的接口,并用于从数据库提取实例。 如果没有自定义Manager,则默认的名称为objects。 Managers 只能通过模型类访问,而不能通过模型实例访问。

定义
class Author(models.Model):
    name = models.CharField(max_length=12)
    age = models.IntegerField()
    manage = models.Manager()

抽象基类

当你想将一些共有信息放进其它一些模型的时候,抽象化类是十分有用的。 你编写完基类之后,在Meta类中设置abstract=True, 这个模型就不会被用来创建任何数据表。 取而代之的是,当它被用来作为一个其他模型的基类时,它的字段将被加入子类的字段中。 如果抽象基类和它的子类有相同的字段名,那么将会出现error(并且Django将抛出一个exception)

参考链接

https://docs.djangoproject.com/en/1.11/

https://www.cnblogs.com/maple-shaw/articles/9323320.html

相关推荐