Django ORM 数据库查询方法汇总大全

什么是Django ORM?

ORM : 全称 object relational mapping, 对象关系映射
功能 : 通过orm实现使用操作对象的方式来操作数据库中的数据
目的 : 就是为了能够让不懂SQL语句的人通过python面向对象的知识点也能够轻松自如的操作数据库
缺陷 : sql 封装死了, 有时候查询速度很慢

ORM与数据库的映射关系是怎么样的?

ORM                        DB
  类 --------------------> 表
对象 --------------------> 数据行
属性 --------------------> 字段

ORM的基本使用方法

1.创建类(表)
我们的模型类需要写在应用下的 models.py 文件中

from django.db import models

class Student(models.Model):
    """
    CharField 类型必须设置 max_length 参数
    verbose_name 是对字段的解释,每个字段都有,且是第一个默认形参,所以可以直接在第一个位置实参处写值不需要写verbose_name=
    null=True 允许字段为空
    default=0 设置默认值
    """
    # id int primary key auto_increment;(sql语句效果与下面orm语句相同)
    id = models.AutoField(primary_key=True,verbose_name="主键ID")
    # name varchar(32);
    name = models.CharField(max_length=32,verbose_name="名字")
    # age int;
    age = models.IntegerField(verbose_name="年龄")
    # pwd int;
    pwd = models.IntegerField("密码",null=True)
    is_delete = models.IntegerField(default=0)

针对主键字段说明

如果你不指定主键 那么orm会自动帮你创建一个名为id的主键字段
如果你想让主键字段名不叫id,儿叫叫uid、sid、pid等其他名字则需要自己手动指定

2.数据库迁移命令
凡是对 models.py 中跟数据库相关的代码进行了更改就必须在项目目录下执行两条命令
这两条命令叫数据库迁移命令, 就比如上面我们创建了一个模型类, 于是我们就要进行这两条命令

# 1.生成数据库同步脚本, 将数据库修改操作先记录下来(对应应用下的 migrations 文件夹)
python3 manage.py makemigrations

# 2.真正的数据库迁移操作
python3 manage.py migrate

APP margrations 文件夹下会生成的文件0001_inital.py这样的文件

再看数据库已经生成了表

3.字段的增删改查
增 : 添加字段代码然后迁移数据库即可

sex = models.CharField('性别',max_length=16)
height = models.IntegerField('身高cm',null=True)  # 可以为空

删 : 注释掉代码然后执行数据库迁移命令即可(删除字段对应的数据也将删除)
改 : 直接改代码然后执行数据库迁移命令即可
查 : 鼠标点点点
4.数据的增删改查

增加数据

# 假设获取到用户传入的数据
username = "shawn"
userpwd = 123
userage = 23

# insert into Student(name,age,pwd) values(username,userpwd,age);

# 方式一 : 
user_obj.models.Student.objects.create(name=username,pwd=passwd,age=userage)
# 方式二 : 
user_obj = models.Student(name=username,pwd=passwd,age=userage)
user_obj.save()

查询数据

# select * from Student where name=usernamr

# 方式一 : 
user_obj = models.User.objects.filter(name=username)[0]
# 方式二 : 
user_obj = models.User.objects.filter(name=username).first()
# 推荐使用.first(). 但是其内部使用的也是通过索引取值

查询所有数据

# select * from Student;

# 方式一 : 
user_obj = models.User.objects.filter()
# 方式二 : 
user_obj = models.User.objects.all()  # [obj1,obj2,obj3]

修改数据

# 方式一 :
models.Student.objects.filter(id=edit_id).update(name=username,pwd=password)

# 方式二 : 
edit_obj = models.Student.objects.filter(id=edit_id).first()
edit_obj.name = username
edit_obj.pwd = password
edit_obj.save()

删除数据

# 直接删除
models.Student.objects.filter(id=edit_id).delete()

# 公司里删除数据并不会真正的删除, 而是在数据后面加一个字段来标志该数据有没有被删除
# 例如用 isdelete 字段来标识, 如果 isdelete=0 则未删除,如果 isdelete=1 则表示删除

 

Django ORM查询语句汇总

#App为model名字
#查询所有内容
obj = models.App.objects.all()
#查询指定字段相关内容
obj = models.App.objects.filter(id=edit_id)
#给查询进行排序
#UpdateTime倒序
obj = models.App.objects.all().order_by('-UpdateTime')
#UpdateTime正序
obj = models.App.objects.all().order_by('UpdateTime')
#某字段最大值和最小值
obj = models.App.objects.aggregate(Max('age'),Min('age'))
#group by
#以ID统计数大小倒顺排列
obj = App.objects.values('Shi').annotate(Count_id=Count('id'), ).order_by('-Count_id')

Django ORM查询大小关系:

__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
exclude 不等于 
j = Job.objects.filter().exclude(status="0").all()#排除status=0的情况
THE END