模型层中模型的基本了解
Posted williamweson
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模型层中模型的基本了解相关的知识,希望对你有一定的参考价值。
模型简介
模型是你的数据的唯一的、确定的信息源。 它包含你所储存数据的必要字段和行为。 通常,每个模型对应数据库中唯一的一张表。
基础:
- 每个模型都是一个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
以上是关于模型层中模型的基本了解的主要内容,如果未能解决你的问题,请参考以下文章