Django Models(模型)
ORM对象映射(object relation mapping)
什么是ORM? 1. Python、PHP、Java是一种开发语言,而MySQL、SQL Server则采用数据库语言,不同语言之间如何实现互操作? 2. SQL语言包括包括数据定义语言DDL、数据控制语言DCL、数据查询语言DQL、数据操作语言DML等,例如INSERT、DELETE、SELECT、UPDATE操作。 3. 作为开发人员,应该把精力放在核心业务代码的编写上面,而不应该花太多精力跟数据库语言打交道。 4. ORM(Object-Relational Mapping,对象关系映射)技术可以看做是开发者和数据库之间的桥梁,用于实现数据库和编程语言之间的映射,本质上来看,ORM就是将SQL操作和编程语言操作做了一个翻译。 5. 通过ORM技术来操作数据库,使得开发者无需接触SQL语句,而直接操作对象的属性和方法,大大提高了开发效率。 ORM的功能是什么? 1. 映射技术:数据类型映射、类映射、关系映射。例如,每一张数据库表对应开发语言的类,每一个数据字段对应类中的属性。 2.CRUD操作:CRUD即增删查改操作,在SQL语句中通过Insert、Select、Update、Delete来实现,在ORM库中则需要通过对应的函数来实现,例如Django ORM通过get、filter、save、delete函数进行操作。 3. 缓存优化:(惰性操作)从数据库查询到的数据以类对象的形式保存在内存,用于随时提取; 真正需要查询结果时才执行数据库的select操作,而不是在ORM查询命令执行时查询数据库。 有哪些ORM技术? Django ORM Django ORM是Django框架内置实现的,简单易用 通过创建Model类和定义Field字段来实现 SQLAlchemy SQLAlchemy则是目前Python ORM通用标准 Peewee Storm
models.py创建
1)创建语法
from django.db import models # 导入models模块 class ModelName(models.Model): # 创建模型类并继承models.Model field1 = models.XXXField(verbose_name="xxx", max_length=xxx ) # 创建field字段,通过Models.XXXField方法;字段里面有xxx属性 filed2 = models.XXXField( ) field3 = models.XXXField( ) class Meta: # 定义Meta子类,为模型类添加其他附加说明 verbose_name = XXX verbose_name_plural = XXX
说明 所有Django模型类继承django.db.models; 每个类ModelName对应数据库中的一张表; 名称格式:appname+modelname 每个field属性对应数据库中的数据项; Meta子类应用定义模型元数据包括数据库表名、默认排序方式、数据库模型等。 Model案例
class UserCMS(models.Model): #创建了一张usercms的表 username = models.CharField(verbose_name="姓名", max_length=50, default="", null=True, blank=True, ) #在表里面,创建username的列;此列的名称叫做“姓名”,此列的最大长度是50 password = models.CharField(verbose_name="密码", max_length=50) 在表里面,创建password的列 此列的名称叫做“密码”,此列的最大长度是50 说明 这里在数据库中,对应的生成一种表cms_usercms,并且具备username和password字段
2)属性及字段
Field类型
AutoField:一个自动递增的整型字段,添加记录时它会自动增长,通常用于数据表的主键; CharField:字符串字段,用于输入较短的字符,对应html标签<input type="text">; TextField:文本字段,用于输入较多的字符,对应html标签<input type = "textarea">; EmailField:邮箱字段,用于输入带有Email格式的字符 DateTimeField:日期字段,支持时间输入 ImageField:用于上传图片并验证图片合法性,需定义upload_to参数,使用本字段需安装python pillow等图片库 IntegerField:整数字段,用于保持整数信息
Field属性 primary_key:设置True or False,定义此字段是否为主键 default:设置默认值,可以设置默认的文本、时间、图片、时间等 null:设置True or False,是否允许数据库字段为Null,默认为False blank:设置True or False,定义是否运行用户不输入,默认为False;若为True,则用户可以不输入此字段 choices:设置该字段的可选值,本字段的值是一个二维元素的元祖;元素的第1个值为实际存储的值,第2个值为HTML页面显示的值 max_length:设置默认长度,一般在CharField、TextField、EmailField等文本字段设置 verbose_name:设置该字段的名称,所有字段都可以设置,在Web页面会显示出来(例如将英文显示为中文) upload_to:设置上传路径,ImageField和FileField字段需要设置此参数 Meta类属性 verbose_name:设置对象名称(例如usecms),若没有设置,则默认为该类名的小写分词形式,例如类名为CamelCase会被转换为camel case; verbose_name_plural:设置对象名称复数(例如usercms),一般设置跟verbose_name一样,否则会默认加s; db_table:设置映射的数据表名,默认为“应用名_模型名”,即用该模型所在app的名称加本模型类的名称 proxy:设置True or False,设置本模型及所有继承本模型的子模型是否为代理模型; abstract:设置True or False,设置本模型类是否为抽象基类; 案例
class User(models.Model): """ 用户 """ name = models.CharField(verbose_name="别名", max_length=100, default="") email = models.CharField(verbose_name="邮箱", max_length=100) password = models.CharField(verbose_name="密码", max_length=128) mobile = models.CharField(verbose_name='手机', max_length=11, blank=True, null=True) birday = models.DateField(verbose_name=u"生日", null=True, blank=True) gen = ( ("male", "男"), ("female", "女"), ) gender = models.CharField(verbose_name="性别", choices=gen, default="male", max_length=10) image = models.ImageField(verbose_name="头像", upload_to="users/%Y/%m", max_length=200, blank=True, null=True)
class Meta: verbose_name = "用户" verbose_name_plural = verbose_name def __unicode__(self): return self.username
3)数据同步
全局同步 makemigrations # 生成数据库表初始化文件initial.py文件 migrate # 基于数据库表初始化文件initial.py文件,正式生成数据表 部分同步 makemigrations cms migrate cms
model操作:
语法 ModelName.Objects.all( ) #查询模型类的所有数据 ModelName.Objects.filter( ) #返回符合筛选条件的数据集(一个或多个对象) ModelName.Objects.get( ) #返回符合筛选条件的数据(单个对象) ModelName.Objects.exclude( )#返回不符合筛选条件的数据集
案例
all_users = UserCMS.objects.all() #将数据表usercms的对象都取出来 interview = Interview.objects.get(id=int(interview_id)) # 根据id获取具体面经 all_interviews = Interview.objects.filter(company=company) #获取此公司的面经
2)增加
语法 ModelName.save( ) ModelName.create( ) 案例 user_cms = UserCMS() user_cms.username = username user_cms.password = password user_cms.save() user_cms = UserCMS.objects.create(username=username, password=password) comment.save()
3)删除
语法 ModelName.Objects.all( ).delete( )#查询所有对象并删除 ModelName.Objects.filter( ).delete( ) #过滤特定对象(一个或多个)并删除 ModelName.Objects.get( ).delete( ) #过滤特定对象(一个)并删除 ModelName.Objects.exclude( ).delete( ) #除了特定对象,其他都删除 案例 deluser = UserCMS.objects.filter(username=username, password=password) deluser.delete()
4)排序
语法 ModelName.Objects.all( ).order_by('xxx') #查询模型类的所有数据并根据关键词排序 案例 all_interviews = Interview.objects.all().order_by('-read_counts')
5)切片
语法 ModelName.Objects.all( ).order_by('xxx')[a:b] #查询模型类的所有数据并根据关键词排序 再此基础上只取从a到b的对象 案例 all_interviews = Interview.objects.all().order_by('-read_counts')[:6] 查询模型类的所有数据并根据关键词排序,并且只取前面6个对象 recommended_interviews = Interview.objects.filter(company=recommended_tag).exclude(id=int(interview_id)).order_by('-read_counts')[:3] # 除去本面经,筛选同公司阅读次数最高的其他三篇面经作为推荐面
进阶操作
关系操作 一对一操作 一对多操作 多对多操作
面向对象操作 抽象类继承 多表继承 代理模型继承
基础操作
1)查询:
来源:oschina
链接:https://my.oschina.net/u/4442211/blog/3212494