开发者社区> 学堂小助手> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

DjangoORM 操作 | 学习笔记

简介: 快速学习 DjangoORM 操作
+关注继续查看

开发者学堂课程【Python Web 框架 Django 快速入门DjangoORM 操作 】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/604/detail/8813


DjangoORM 操作


内容简介

一、具体内容


一、具体内容

#注册函数

def reg(request: HttpRequest ):

print(request.POST)

print(request. body)

payload=simple json. loads(request. body)

try:

#有任何异常,都返回400,如果保存数据出错,则向外抛出异常email=payload['email']

query=User-objects. filter(email=email)

print(query)

print(type(query),query. query)#查看SQL语句

if query:

returnttpResponseBadRequest ()#这里返回实例,这不是异常类

name=payload[ˈname']

password=payload['password']

print(email, name, password)

user=User()

user, email=email

user, name=name

user. password=password

try:

user,save()

return] sonResponse ({-user':user. id}}如果正常,返回json数据except:

raise

except Exception ase:#有任何异常,都返回

print(e)

returntt  tpResponseBadRequest ()#这里返回实例,这不是异常类

邮箱检查

邮箱检查需要查 user 表,需要使用 Useri 类的 filter 方法。

email=email,前面是字段各 email ,后面是 email 变量。查询后返回结果,如果查询有结果,则说明该 email 已经存在,返回 400 到前端。

用户信息存储

创建 User 类实例,属性存储数据,最后调用 Save 方法。Djangol 默认是在save()、delete()—的时候事务自动提交。如果提交抛出任何错误,则捕获此异常做相应出错。

异常处理

出现获取输入框提交信息异常,就返回异常

查询邮箱存在,返回异常

save() 方法保存数据,有异常,则向外抛出,捕获返回异常

注意一点,Django 的异常类继承自 HttpResponse  类,所以不能 raise,只能return

前端通过状态码判断是否成功

模型类操作

管理器对象

Django 会为模型类提供一个objects对象,它是django. db. models. manager. Manager 类型,用于与数据库交互。当定义模型类的时候没有指定管理器,则 Django 会为模型类提供一个 objects 的管理器。如果在模型类中手动指定管理器后,Django 不再提供默认的 objects 的管理器了。

管理器是 Django 的模型进行数据库查询操作的接口,Django 应用的每个模型都至少拥有一个管理器。

DjangoORM

数据的校验 validation 是在对象的Save、update方法上

如下图所示

对模型对象的CRUD,被 Django、ORM 转换成相应的 SQL 语句操作不同的数据源。

from django,db import models

class use(models. Model):

cla's Meta:

db _ table='user'

id=models.AutoField(primary _ key=True)name=models.CharField(maxlength=48,null=False)email=models.CharField(max _ length=64, null=false, unique=True)password=models.CharField(max length=128, null=false)

def _ repr _(self):

return"". format(self. id, self. name)

_ str _=_ repr _

具体的操作内容如下:

fromdjango . httpimportJsonResponse , HttpRequest , HtpRespone , HttpResponseBadRequet  import json

from models import User

def  checkemail (request):

#判断email

return  HttpResponse ()

def reg(request: HttpRequest ):

try:

payload=simple json. loads(request. body)

emailpayload [ˈemail']

#数据库中看看email有没有

mgr=User. objects. filter(email=email)

print()列表[]

print(type(mgr))查询集、结果集

if qs:#该email已经存在了

return HttpResponseBadRequest ()

name=payload ['name']

password=payload[ˈpassword']

print(email, name, password)

user=User()

user. email=email

user. name=name

user-password=password

try:

user. save()

return  JsonResponse ()# 200

except Exception as e:

logging.info (e)

return  HttpResponeBadRequest ()

except Exception as e:

logging.info (e)

returnttpResponseBadRequest ()

查询

查询集

查询会返回结果的集,它是 django. db. models. query.QuerySet 类型。

它是惰性求值,和  sqlalchemy  一样。结果就是查询的集。

它是可迭代对象。

1、惰性求值:

创建查询集不会带来任何数据库的访问,直到调用数据时,才会访问数据库。在迭代、序列化、if 语句中都会立即求值

2、缓存:

每一个查询集都包含一个缓存,来最小化对数据库的访问。

新建查询集,缓存为空。首次对查询集求值时,会发生数据库查询,Django 会把查询的结果存在这个缓存中,并返回请求的结果,接下来对查询集求值将使用缓存的结果。

观察下面的2个例子是要看真正生成的语句了

(1)没有使用缓存,每次都要去查库,查了2次库,

[user. name for user in User. objects. all()]

[user. name for user in User. objects. all()]

(2)下面的语句使用缓存,因为使用同一个结果集

qs User. objects. all()

[user,name for user in qs]

[user. name for user in qs]

限制查询集(切片)

查询集对象可以直接使用索引下标的方式(不支持负索引),相当于SQL语句中的limit和officet子句。注意使用索引返回的新的结果集,依然是惰性求值,不会立即查询。

qs=User. objects. all()[20:40]I

# LIMIT20OFFSET  20

qs=User. objects. all()[20:30]

#LIMIT 10 OFFSET 20

过滤器

返回查询集的方法,称为过滤器,如下:

column

column

all()

filter() 

过滤,返回满足条件的数据

exclude()

排除,排除满足条件的数据

order _ by()

values()

返回一个对象字典的列表。像json

filter(k1=v1). filter(k2=v2) 等价于 filter(k1=v1,k2=v2)

fluter(pk=10) 这里 pk 指的就是主键,不用关心主键字段名,当然也可以使用使用主键名 filter(emp _ no=10)

返回单个值的方法

column

column

get()

仅返回单个满足条件的对象

如果未能返回对象则抛出 DoesNotExist 异常;如果能返回多条,抛出 MultipleObjectsReturned

异常

count()

返回当前查询的总条数

first()

返回第一个对象

last()

返回最后一个对象

exist()

判断查询集中是否有数据,如果有则返回True

user=User. objects. filter(email=email),get()

#期待查询集只有一行,否则抛出异常

user=User. objects. get(email=email)

#返回不是查询集,而是一个User实例,否则抛出异常

user=User. objects. get(id=1)

#更多的查询使用主键,也可以使用pk=1

user=User. objects. first()

#使用limit 1查询,查到返回一个实例,查不到返回None

user=User-objects. filter(pk=3, email=email). first()

#and 条件

字段查询 (Field Lookup) 表达式

字段查询表达式可以作为 filter0、exclude0、get0 的参数,实现 where 子句。

语法:属性(字段)名称_比较运算符=值

注意:属性名和运算符之间使用双下划线

字段查询( FieldLookup )表达式

字段查询表达式可以作为 filter()、exclude()、get(i) 的参数,实现 where 子句。

语法:属性(字段)名称_比较运算符=值

注意:属性名和运算符之间使用双下划线

比较运算符如下

column

column

exaxt

filter(isdeleted=False)

filter(isdeleted-exact=False)

严格等于,可省略不写

contains

exclude( titlecontains ='天')

是否包含,大小写敏感,等价于like'%天%'

statswith

endswith

filter(title _startswith ='天')

以什么开头或结尾,大小写敏感

isnull

isnotnull

filter(title _ is null=False)

是否为null

iexact

icontains

istartswith

iendswith

i的意思是忽略大小写

in

filter(pk _ in=[1,2,3,100]

是否在指定范围数据中

gt、gte

it、ite

filter(id _ gt=3)

filter(pk _1td=6)

filter(pub_date_gt=date(2000,1,1))

大于、小于等

year、month、day

week _ day

hour、minute、

second

filter(pub _ date _ year=2000)

对日期类型属性处理

Q对象

虽然 Django 提供传入条件的方式,但是不方便,它还提供了Q对象来解决。

Q对象是 diango. db. models.Q,可以使用 &(and)、[(or)操作符来组成逻辑表达式。-表示not.

from django. db. models import Q

User. objects. filter(Q(pk _1t=6))

#不如直接写User. objects. filter(pk<6)

User. objects. filter(pk _ gt=6). filter(pk _1t=10)

#与

User. objects. filter(Q(pk _ gt=6)&Q(pk _1t=10))

#与

User-objects. filter(Q(pk=6)lQ(pk=10))

#或

User. objects. filter(~Q(pk _1t<6))

#非

可使用 & 和 Q 对象来构造复杂的逻辑表达式

过滤器函数可以使用一个或多个 Q 对象

如果混用关键字参数和 Q 对象,那么 Q 对象必须位于关键字参数的前面。所有参数都将 and 在一起

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Django框架之ORM
Django框架之ORM
33 0
Django框架之ORM
Django框架之ORM
71 0
基于Django实现 RESTful API 之RestFramework框架3
接下来学习RestFramework框架中的认证、权限、频率组件的使用 一、首先实现用户login登录认证功能 做用户登录认证功能可以通过session、cookie和token三种形式,下面的login认证基于token实现 关键点 -- 首先需要...
1313 0
基于Django实现 RESTful API 之RestFramework框架2
前言:上一篇关于RestFramework框架的文章介绍了APIView、解析器和序列化三个很重要的组件,这三个组件的源码执行流程可以说是RestFramework框架的核心部分,要是你完全吃透了,那先恭喜您了,接下来的组件对您来说就很简单了,顺着之前的源码思路很快就融会贯通了。
1439 0
基于Django实现 RESTful API 之RestFramework框架1
一、首先什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资...
1574 0
有Python基础,刚接触web框架的Django初学者
本文面向:有Python基础,刚接触web框架的Django初学者。 环境:windows7 python3.5.1 pycharm Django 1.10版 pip3 一、Django简介 百度百科:一个开放源代码的Web框架,由Python语言编写...... 重点:一个大而全的框架,啥都替你考虑好了。
3274 0
Python高级进阶(二)Python框架之Django写图书管理系统(LMS)
正式写项目准备前的工作   Django是一个Web框架,我们使用它就是因为它能够把前后端解耦合而且能够与数据库建立ORM,这样,一个Python开发工程师只需要干自己开发的事情就可以了,而在使用之前就我们需要给Django做文件配置和数据库配置   上一章写过的文章,有些朋友反应,对于Web框...
1793 0
Python高级进阶(一)Python框架之Django入门
传说中的Django Django由来   Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的框架模式,即模型M,视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。
3106 0
1786
文章
0
问答
来源圈子
更多
技术图谱:由专家组参与技术图谱的绘制与编写,知识与实践的结合让开发者们掌握学习路线与逻辑,快速提升技能 电子书:电子书由阿里内外专家打造,供开发者们下载学习,更与课程相结合,使用户更易理解掌握课程内容 训练营:学习训练营 深入浅出,专家授课,带领开发者们快速上云 精品课程:汇集知识碎片,解决技术难题,体系化学习场景,深入浅出,易于理解 技能自测:提供免费测试,摸底自查 体验实验室:学完即练,云资源免费使用
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载