ORM

对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。

Django中的映射关系:

表名<------>类名

字段<------>属性

表记录<----->类实例对象

创建表(建立模型)

from django.db import models

analyse = '''
分析:
一本书 可以由多个作者编著
一本书只能由一个出版社出版
一个作者可以写多本书
每个作者有自己的简介
对应关系:
Author-Book --> 多对多
Publish-Book --> 一对多
Author-AuhtorDetail --> 一对一
如何创建:
多对多:ManyToManyField
一对多:ForeignKey
一对一:OneToOneField
创建一对多表的时候,ForeignKey建在多的那一方。另外两个随意建在哪一方。
''' class Publish(models.Model):
# 出版社
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
email = models.EmailField() class Author(models.Model):
# 作者
name = models.CharField(max_length=32)
age = models.IntegerField() class AuhtorDetail(models.Model):
# 作者简介
addr = models.CharField(max_length=32)
email = models.EmailField()
author = models.OneToOneField('Author') class Book(models.Model):
# 书籍
title = models.CharField(max_length=32)
publishDate = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2) # 最大 999.99
publish = models.ForeignKey('Publish') # 一对多
authors = models.ManyToManyField('Author') # 多对多

  

注意:建立一对多的关系时,外键字段建立在多的一方。建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表

当创建好model.py里面的类(也就是数据库中对应的表)之后,还需要输入以下两条命令来生成并更新表:

python manage.py makemigrations

python manage.py migrate

上面的命令执行成功后,表就创建出来了,此时表中还没有添加记录。

这些类实例化出来的对象就是对应数据库表中的一条记录。

通过配置settings.py文件的logging可以查看ORM操作运用的sql语句(下面的代码粘贴到settings.py里就行)

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}  

字段选项

每个字段有一些特有的参数,例如,CharField需要max_length参数来指定VARCHAR数据库字段的大小。

常用通用参数:

null
如果为True,Django 将用NULL 来在数据库中存储空值。 默认值是 False. blank
如果为True,该字段允许不填。默认为False。
要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。
如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。 default
字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。 primary_key
如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True,
Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为,
否则没必要设置任何一个字段的primary_key=True。 unique
如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的

更多详见模型字段参考

添加表记录

普通字段

# 方式1
publish_obj=Publish(name="人民出版社",city="北京",email="renMin@163.com")
publish_obj.save() # 将数据保存到数据库 # 方式2 (也可以接收到一个返回值,是添加的记录对象)
Publish.objects.create(name="人民出版社",city="北京",email="renMin@163.com")
# # 方式3(了解,慎用,因为request里面还可能有表之外的其他内容)
Publish.objects.create(**request.POST.dict())

 ......

查询表记录

查询相关API

all():                 查询所有结果

filter(**kwargs):      它包含了与所给筛选条件相匹配的对象

get(**kwargs):         返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
如果符合筛选条件的对象超过一个或者没有都会抛出错误。 exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
model的实例化对象,而是一个可迭代的字典序列 values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 order_by(*field): 对查询结果排序 reverse(): 对查询结果反向排序 distinct(): 从返回结果中剔除重复纪录 count(): 返回数据库中匹配查询(QuerySet)的对象数量。 first(): 返回第一条记录 last(): 返回最后一条记录 exists(): 优化查询,如果QuerySet包含数据,就返回True,否则返回False

双下划线之单表查询

models.Tb1.objects.filter(id__gt=1, id__lt=10)   # 获取id大于1 且 小于10的值

models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in models.Tb1.objects.filter(name__contains="ven") # 模糊查询类似mysql中的%like%
models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感 models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and,包含1跟2 startswith,istartswith, endswith, iendswith 

  ......

  

Django Model基础 ORM的更多相关文章

  1. Django Model基础操作

    关于设计django model django为我们集成了ORM对数据库进行操作,我们只需要进行定义model,django就会自动为我们创建表,以及表之间的关联关系 创建好一个django项目-首先 ...

  2. django框架基础-ORM基础-长期维护

    ###############    ORM介绍  ################ """ ORM简介: ORM 全拼Object-Relation Mapping. ...

  3. Django——model基础

      ORM 映射关系: 表名 <-------> 类名 字段 <-------> 属性 表记录 <------->类实例对象 创建表(建立模型) 实例:我们来假定下 ...

  4. django框架基础-ORM进阶-长期维护

    ###############    ORM进阶---contenttype    ################ 设计思路: """ 路飞有两种课,专题课和学位课, ...

  5. Python Web框架篇:Django Model基础

    model是关于你的数据的单一的,确定的信息来源. 它包含您正在存储的数据的基本字段和行为.Django通过抽象化的模型层(models)为你的网络应用提供对于数据的结构化处理和操作处理,数据库相关的 ...

  6. Django Model 基础

    程序涉及到数据库相关操作时,一般都会这样: 创建数据库,设计表结构和字段 使用 pymysql 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import pymysq ...

  7. django框架基础-ORM跨表操作-长期维护

    ###############    一对一跨表查询    ################ import os if __name__ == '__main__': os.environ.setde ...

  8. django框架基础-ORM单表操作-长期维护

    ###############    单表操作-添加数据    ################ import os if __name__ == '__main__': os.environ.set ...

  9. Django 06 Django模型基础1(ORM简介、数据库连接配置、模型的创建与映射、数据的增删改查)

    Django 06 Django模型基础1(ORM简介.数据库连接配置.模型的创建与映射.数据的增删改查) 一.ORM系统 #django模型映射关系 #模型类-----数据表 #类属性-----表字 ...

随机推荐

  1. json 与字符串相互转换,

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  2. Disabling the Windows 8 UAC

    http://www.computerperformance.co.uk/win8/windows8-uac-disable.htm https://msdn.microsoft.com/en-us/ ...

  3. Dash:程序员的好帮手(转载)

    作为一名死coder,每天最常见的动作就是查看各种API文档,你一定也有过同时打开N个窗口(HTML.PDF.CHM),不停的在编辑器与文档之间切换的感受吧?怎么说呢,其实我很讨厌这种枯燥无味的动作, ...

  4. Gerrit 使用规范

    代码提交要求 一个Commit对应一个修改点(除非是在项目初始阶段或是升级BSP时). 不要随便修改文件的属性.Windows 修改过的文件属性会变成755,上传代码时请注意修改成文件的原属性,可以用 ...

  5. mysql-5.6.17-win32安装

    下载免安装压缩文件http://dev.mysql.com/downloads/mysql/ 解压到自定义目录,我这里演示的是D:\wamp\mysql\   复制根目录下的my-default.in ...

  6. Android 运行 Linux 可执行程序

    /**************************************************************************** * Android 运行 Linux 可执行 ...

  7. 查看linux安装包的版本信息-TX2

    前言 新到手一块TX2板子,想要检查系统是否安装某软件及其版本. 操作命令 Cuda8.:nvcc --version Opencv:pkg-config --modversion opencv G+ ...

  8. 2018CCPC女生赛(树上莫队)

    签到题这里久懒得写了. B - 缺失的数据范围 Total Submission(s): 2602    Accepted Submission(s): 559 题意:求最大的N,满足N^a*[log ...

  9. HDU1024 最大M子段和问题 (单调队列优化)

    Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  10. centos yum出现no module named yum

    运行yum出现如下错误 There was a problem importing one of the Python modules required to run yum. The error l ...