django orm - 模型

django 模型是数据库中的映射,也叫对象关系映射(Object Relational Mapping,简称ORM)。

一、创建模型

  • 每个模型都是一个 Python 的类,这些类继承 django.db.models.Model

  • 模型类的每个属性都相当于一个数据库的字段。


example 1. 创建模型示例

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 是模型的 字段。每个字段都被指定为一个类属性,并且每个属性映射为一个数据库列。

说明:

  • 上面的模型会在数据库中映射一张表,表名为 <appname>_person,这说明我们可以在不同的app中创建相同名称的模型,django创建表时会根据app进行区分。

  • 虽然我们的模型中只有两个字段,但是在数据库表中会自动生成三个字段,django会自动添加一个(自动递增的) id 字段

二、使用模型

当我们创建完模型后,直接在数据库中是查找不到对应的表的,还需要进行一定的配置和操作。

1. 配置数据库

在项目的配置文件settings.py中,具有以下设置:

# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

这个是django的默认配置,使用sqlite3数据库,除此之外我们还可以使用mysqloracle等数据库,这里使用默认配置。

2. 设置INSTALLED_APPS

在我们的项目中可能包含很多的app,如果我们要使用app的模型model,则需要将app添加进settings.pyINSTALLED_APPS

# settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'my_app', # 新添加的 `app` 名称
]

3. 使用python manage.py makemigrations生成迁移文件

注意:如果有以下提示,说明你执行命令所在路径不对,应该进入项目目录下,与manage.py同一级

 can't open file 'manage.py': [Errno 2] No such file or directory

正确执行该命令,则有以下提示:

Migrations for 'my_app':
  my_app/migrations/0001_initial.py
    - Create model Person

该命令在my_appmigrations目录下生成了0001_initial.py文件,点开查看:

……
operations = [
        migrations.CreateModel(
            name='Person',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('first_name', models.CharField(max_length=30)),
                ('last_name', models.CharField(max_length=30)),
            ],
        ),
    ]

该文件还没有完全转换为sql语句,但也可以看出表中有三个字段,分别为id,first_name,last_name.

注意:使用python manage.py makemigrations是对所有的app进行检查,是否有appmodel新增 / 更改。如果我们在同时开发多个app,且自己只负责某 一个 / 几个,则应该指定app名称

python manage.py makemigrations my_app

4. 使用python manage.py migrate生成 / 更改数据表

使用python manage.py migrate可以将模型model内容真正映射到数据库中。
同样的,如果我们只想对具体的app起作用。

python manage.py migrate my_app

三、模型中的字段

模型中的字段与数据库表中的字段具有映射关系,我们上述使用的CharField会在数据库中创建varchar类型字段。

django常用内置模型字段

  • AutoField 自动增长的整数型,一般用于id主键
  • BooleanField 布尔类型,可以是TrueFalse
  • NullBooleanField 可以存储布尔值数据,也可以存储空null数据
  • CharField 字符串类型
  • TextField:存储文章内容信息数据,存储比较长的文本信息
  • DateField 日期类型
  • DateTimeField 日期-时间类型
  • DurationField时间段 类型,对应pythondatetime.timedelta类型
  • EmailField 存储电子邮件格式的数据,继承了CharFieldDjango Admin以及ModelForm中提供验证机制
  • IntegerField 存储整型数据
  • GenericIPAddressField 存储IP地址信息数据
  • PositiveIntegerField 存储正整数数据
  • TimeField 存储时间信息,对应python 的 datetime.time
  • URLField:存储URL网址信息,Django Admin以及ModelForm中提供验证url
  • IPAddressField Django Admin以及ModelForm中提供验证IPV4机制
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容