1.数据库模型
Django ORM 操作数据库
我们知道Django处理一个HTTP完整的请求和响应流程中,要想响应动态的数据给HTTP的客户端,就必须解决怎么从数据库中处理数据。
Django 使用了一种新的方式,关系对象映射(Object Relational Mapping,简称ORM),其他语言其实也有自己的ORM
PHP:activerecord
Java:Hibernate
C# :Entity Framework
django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表。
模型配置:
- 1.创建users app
tools》run manage.py task >>控制台:manage.py@DjangoStart > startapp users
- 2.编写users的models
a.继承Django默认提供的user表:from django.contrib.auth.models import AbstractUser
b.编写自己的user表
1 # -*- coding: utf-8 -*- 2 from __future__ import unicode_literals 3 4 # 导入默认提供的user表 5 from django.contrib.auth.models import AbstractUser 6 from django.db import models 7 8 # Create your models here. 9 # 继承AbstractUser默认user表 10 class UserProfile(AbstractUser): 11 nick_name = models.CharField(max_length=50,verbose_name=u'昵称',default=u"") 12 # null = True:表示空值将会被存储为NULL 13 # blank = True:表示在页面当中对应的表单可以为空,可以不填任何内容 14 birday = models.DateField(verbose_name=u'生日',null=True) 15 gender = models.CharField(max_length=50,choices=(('male',u'男'),('female','女')),default='male') 16 address = models.CharField(max_length=100,default=u"") 17 mobile = models.CharField(max_length=11,null = True,blank=True) 18 image = models.ImageField(upload_to='image/%Y/%m',default=u"image/default.png",max_length=100) # 因为图片在后台是以字符串形式存放,所以要长度 19 20 class Meta: 21 verbose_name = "用户信息" 22 verbose_name_plural = verbose_name # 复数形式 23 24 def __unicode__(self): 25 return self.username
- 3.添加users app 到settings中,同时重载AUTH_USER_MODEL = "users.UserProfile",django允许,通过设置AUTH_USER_MODEL值来重定义默认用户模型
s![]()
- 4.makemigrations users 创建数据库生成的中间文件,migrate users 创建实际数据表
在你改动了 model.py的内容之后执行下面的命令:
Python manger.py makemigrations
相当于 在该app下建立 migrations目录,并记录下你所有的关于modes.py的改动,比如0001_initial.py, 但是这个改动还没有作用到数据库文件
在此之后执行命令
python manager.py migrate
将该改动作用到数据库文件,比如产生table之类
参考:
ORM 是如何映射的
Django 规定在 models.py 文件内 创建一个类,然后进行初始化、迁移后,Django就会根据这个类在数据库中创建相应的表以及表的字段内容。
其对应关系如下:
类名 ------> 数据库中的表名
类属性 ------> 表字段
每一个实例化的对象 ------> 表中的每一天数据
在 models.py 文件中,每一个模型类都会被映射为一张数据库中的表,除此之外字段的数据类型,表的主键、外键、约束等也通过类的属性来定义。而且,数据类型及其最大长度是必须指明的。
示例:
|
1
2
3
4
5
6
7
|
class Students (models.model): sid = models.AutoField(primary_key=True) # 当设置为主键时,就会自动被赋予自增、唯一等属性 name = models.CharField(max_length=32) age = models.IntegerField() # 数字不用指明长度 gender = models.CharField(max_length=6) classees = models.CharField(max_length=32) class Mata: db_table = Students |
解析说明:
- 所有的Django模型类都必须继承 django.db.models.Model 类。
- 通过其中类属性定义模型字段,模型字段必须是某种 models.XXField 类型,需要指明长度的类型,最大长度也是需要指明的。
- 通过模型类中的 Meta 子类定义模型元数据,比如数据库的表名、数据默认排序方式等。
Meta 类的属性名由 Django 预先定义,常用的 Meta 类属性汇总如下:
- absstract: True of False,标识本类是否为抽象基类。
- app_label: 定义本类的所属的应用,比如 app_label = 'myapp'
- db_table: 映射的数据库的表名,假如不指定,则 Django 会自动创建,命名格式为:“应用名_模型类名”
- db_tablespace: 映射的表空间名称。某一些数据库存在表空间概念,如Oracle,不存在的忽略。
- default_related_name: 定义本模型的反向映射关系
- get_latest_by: 定义按哪个字段值排序
- managed: True or False ,定义 Django 的manage.py 命令行工具是否管理本模型。默认为 True。False 是不会在数据库中生成表。
- order_with_respect_to: 定义本模型按照某外键引用的关系排序
- ordering: 本模型默认排序字段,可设置多个(见《Python 高效开发实战》191页)
Django 术语:"生成数据移植文件" (makemigrations)
是指将 models.py 中定义的数据表转换成数据库生成脚本的过程。改过程通过命令完成:
|
1
|
cd Myproject # 先进入到 Django 目录python3 manage.py makemigrations app |
此命令执行成功后,会在应用 app 的 migrations 目录下创建 0001_initial.py 文件;这个文件是数据库生成的中间文件,通过它可以指定当前的数据库版本。
在 makemigrations 的过程中,Django 会对比 models.py 中的模型与已有数据库之间的差异,如果没有差异则不做任何操作。
假如对 models.py 有任何改变,则在下次执行 makemigrations 的时候会同步更新到数据库。


浙公网安备 33010602011771号