Django ORM总结

### 1.orm

ORM:对象关系映射 面向对象和关系型数据库的映射关系 通过操作对象的方法和属性操作数据库

对应关系:

​ 类 ——》 表

​ 对象 ——》 数据行(记录)

​ 属性 ——》 字段

### 2.必知必会13条

返回对象列表的:

​ all 获取表中所有的对象

​ filter 获取满足条件的所有的对象

​ exclude 获取不满足条件的所有的对象

​ order_by 排序 默认升序 加- 降序

​ reverse 对已经排序的对象列表进行倒序

​ values 获取对象的字段名和值 {} 不带参数——》 获取所有字段的名和值 指定字段

​ values_list 获取对象的值 () 不带参数——》 获取所有字段值 指定字段

​ distinct 去重

返回对象:

​ get 没有或者多个就报错

​ first 取第一个

​ last 取最后一个

返回布尔值:

​ exists 是都存在

返回数字

​ count 计数

### 3.单表的双下划线

id__gt

id__lt

id__gte

id__lte

id__range=[1,5]

id__in=[ 1,5 ]

name__startswith='a'

name__istartswith='a'

name__endswith='a'

name__contains='a' # like

name__isnull = True

date__year

### 4.外键

表示一对多的关系

基于对象

正向查询 book ——》 publisher

book_obj.publisher ——》 所关联的出版社对象

book_obj.publisher.name ——》 所关联的出版社对象名称

book_obj.publisher.pk ——》 所关联的出版社对象主键

book_obj.publisher_id ——》 从book中直接拿到所关联对象的id

 

反向查询 publisher ——》 book

不指定related_name

pub_obj.book_set ——》 关系管理对象

pub_obj.book_set.all() ——》 出版社出版所有的书籍对象

指定related_name=’books‘

pub_obj.books ——》 关系管理对象

pub_obj.books.all() ——》 出版社出版所有的书籍对象

 

基于字段查询

models.Book.objects.filter(publisher__name='人民出版社')

 

不指定related_name

models.Publisher.objects.filter(book__name='跟金老板学开车')

指定related_name =’books‘

models.Publisher.objects.filter(books__name='跟金老板学开车')

指定related_query_name =’book‘

models.Publisher.objects.filter(book__name='跟金老板学开车')

 

 

### 5.多对多

基于对象的查询

author_obj.books ——》 关系管理对象

author_obj.books.all() ——》 关系管理对象

 

不指定related_name

book_obj.author_set ——》 关系管理对象

book_obj.author_set.all() ——》 作者写过所有的书籍对象

指定related_name=’authors‘

book_obj.authors——》 关系管理对象

book_obj.authors.all() ——》 作者写过所有的书籍对象

 

管理对象的方法

all 获取所有的对象

set 设置关系 多对多 [ id,id ] [对象,对象] 一对多 [对象]

add 添加关系 多对多 id,id 对象,对象 一对多 对象

remove 删除关系 一对多:必须设置外键可为空,才有remove clear方法

clear 清空所有的关系

create 创建一个对象并且添加关系

​ book_obj.authors.create(name='xxxx')

 

 

### 1.聚合和分组

聚合

ret = models.Book.objects.aggregate(Avg('price'), max=Max('price')

分组

# 统计出每个出版社买的最便宜的书的价格
# 方式一
# ret = models.Publisher.objects.annotate(min=Min('book__price')).values() # 对象列表

# 方式二
# ret = models.Book.objects.values('publisher__name').annotate(min=Min('price')) # 对象列表

select dept, avg('salary') from employee group by dept;

 

 

### 2.F 和 Q

```
Q(pk__lt=3)

| 或
& 与
~ 非

# F使用查询条件的值, 专门取对象中某列值得操作 from django.db.models import F

#动态的获取字段的值

ret= models.Book.objects.filter(kucun__gt=F('sale')).values() # update更新指定字段

models.Book.objects.all().update(sale=F('sale')*2)


```

 

 

### 3.事务

```

用于写入数据库出错的时候回滚使用
from app01 import models
from django.db import transaction

try:
with transaction.atomic():
# 一系列操作
models.Author.objects.create(name='asasdasdas')
models.Author.objects.create(name='asasdasdas')
models.Author.objects.create(name='asasdasdas')

except Exception as e:
print(e)
```

 

 

### 4.cookie

https://www.cnblogs.com/maple-shaw/articles/9502602.html

定义:

​ cookie就是保存在浏览器本地的一组组键值对

特性:

1. 服务器让浏览器进行设置的
2. 保存在浏览器本地的,浏览器也不可以不保存
3. 下次访问时自动携带相应的cookie

cookie能做什么:

1. 登录
2. 保存用户的浏览习惯
3. 投票

django的操作:

1. 设置

```
ret = redirect('/home/')
ret.set_cookie('is_login', '1') # 普通的cookie

ret.set_signed_cookie('is_login', '1', 'day62') # 加密的cookie

```

2. 获取

request.COOKIES {} # 普通的cookie

request.get_signed_cookie('is_login',salt='day62',default='') # 加密的cookie

 

3. 删除

ret = redirect('/login/')
ret.delete_cookie('is_login')


5.session

 

 

 

 

 

 

posted @ 2019-04-10 15:46  呼呼嘻嘻  阅读(74)  评论(0编辑  收藏  举报