Django orm使用教程

Django orm使用教程

标签(空格分隔): Django orm


前言

orm使用五步走:

  1. 在settings文件中设置数据库连接配置
  2. 创建app
  3. 在models里面创建类
  4. 使用python make migrations命令将改变登记在小本本上面
  5. 使用python migrate命令将改动同步到数据库中

数值类型(常用)

  1. CharField varchar类型:name = models.CharField(max_length=32)
  2. IntegerField
    int类型:age = models.IntegerField()
  3. DecimalField
    decimal类型: money = models.DecimalField(max_digits=5,decimal_places=2,default=9.9)
  4. DateField
    Date类型:publish_date = models.DateField(auto_now_add=True)
  5. AutoField 一般用于id字段实现id字段的自增属性,在Django的orm中可以不用加id字段,orm在创建表的时候会自动将该字段添加到表中
  6. 实现ENUM数据类型的方式:
gender_choice=((1,'男'),(2,'女'))
gender = models.SmallIntegerField(choices=gender_choice,default=1)

表的三种关系

1.多对一:使用外键关联:ForeignKey
2.多对多:使用一张新的表:在 orm中可以直接使用ManyToManyField创建
3.一对一:在外键的基础上增加unique属性或者用OneToOneField创建一对一关系

orm之增删改

  • create():创建一个新对象,并保存对象
import datetime
models.author.objects.first().book_set.create(title='番茄物语')
  • add():把指定的model对象添加到关联对象集中
author_objs = models.author.objects.filter(id__lt=3)
models.book.objects.first().author.add(*author_objs)

-set():更新model对象的关联对象

book_obj = models.book.objects.first()
book_obj.authors.set([2,3])

-remove():从关联对象集中移除执行的model对象

book_obj = models.book.objects.first()
book_obj.authors.remove(3)

-clear():从关联对象集中移除一切对象
book_obj = models.book.objects.first()
book_obj.authors.clear()

必知必会13条

  1. all(): 查询所有结果
  2. filter(**kwargs) 包含了与所筛选条件相匹配的对象
  3. get(**kwargs) 返回与所筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误
  4. exclude(**kwargs) 返回与筛选条件不匹配的对象
  5. values(*field) 返回一个ValueQuerySet,运行后得到的并不是一系列model的实例化对象,得到的而是一个可迭代字典对象
  6. values_list(*field) 与values()非常相似,它返回的是一个元祖序列,而values()返回的是一个字典序列
  7. order_by(*field) 查询结果排序
  8. reverse() 对查询结果反向排序,reverse()通常只能在具有已定义序列顺序的QuerySet上调用
  9. distinct() 从返回结果中剔除重复记录
  10. 返回数据库中匹配查询(QuerySet)的对象数量
  11. first() 返回第一条记录
  12. last() 返回最后一条记录
  13. exists() 如果QuerySet包含数据,就返回True,否则返回False

单表查询和多表查询相关操作

数据库连表操作基础知识

单表查询

1、单表查询语法:

select 字段名 from 表名 
            where 条件 
            group by field 
            having 筛选 
            order by field 
            limit 限制条数

2、关键字的执行优先级

1. 拿到表 from
2. 拿着where后面的条件去表中找一条一条的数据
3. 取出一条一条数据后进行聚类group by
4. 将分组后的数据进行having条件筛选
5. 将筛选完后的结果用order by进行排序,最后用limit限制能够查出的结果的条数

3、group by分组查询

1.单独使用group by关键字分组
select post from employee group by post
2.和group_concat()函数一起使用
select post,group_concat(name) from employee group by post
3.和聚合函数一起使用
select post,count(id) as count from employee group by post
#统计数据数量:
select count(id) from employee group by id

4、聚合函数

聚合函数:count max min avg sum
select count(*) from employee;
select max(salary) from employee;
select min(salary) from employee;
select avg(salary) from employee;
select sum(salary) from employee;

5、使用正则表达式查询

select * from employee where name regexp '^ale';

多表查询

多表查询语法

select 字段列表 from 表1 inner|left|right join 表2 on 表1.字段 = 表2.字段

Django orm查询操作

单表查询

1、单表查询语法

1. 返回QuerySet对象的方法
all()
filter()
exclude()
order_by()
reverse()
distinct()
2. 返回特殊的QuerySet
values()
values_list()
3. 返回具体对象的方法
get()
first()
last()
4. 返回布尔值的方法
exist()
5、返回数字的方法
count()

多表查询操作

1、正向查询

1. 通过对象
book_obj = models.book.objects.first()
res = book_obj.publisher.name
2.通过values()和value_list()方法结合双下划线进行跨表查询操作
res = models.book.objects.values('publisher__name')

2、反向查询

1.通过对象
语法:obj.表名_set
publisher_obj = models.publisher.objects.first()
books = publisher_obj.book_set.all()
titles = books.values_list('title')
2.通过values()和value_list()方法结合双下划线进行跨表查询操作
语法:表名__字段
titles = models.publisher.objects.values_list('book__title')

3、聚合查询和分组查询

1、聚合

from django.db.models import Avg,Sum,Max,Min,Count
models.book.objects.all().aggregate(Avg('prict'))

2、分组

from django.db.models import Avg,Sum,Max,Min,Count
#按照dept进行分组,查询每个组的平均工资,并用字典的形式返回
employee.objects.values('dept').annotate(avg = Avg('salary').values('dept,'avg')

转载于:https://www.cnblogs.com/guanzhicheng/p/9206151.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值