细说Django中ORM 的增删改查操作
首先新建一个Django项目,并在mysql中新建数据,然后再settings.py中配置数据库信息,别忘了在项目下的__init__.py文件下加上:
我在models.py文件中新建几个类:
新建完成之后 在Terminal 里跑两条语句:
然后 我在person中加了几条数据
做好了以上工作,我们就可以练习增删改查操作了
你可以打开python Console操作,话不多说,直接上图
但是使用这种有个缺点就是不能保存下来
所以,我新建了一个Python文件
ORM-查
import os
if __name__ == "__main__":
# 加载Django项目的配置信息,记不住的话就去manage.py文件里复制
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ormday69.settings")
# 导入Django 并启动Django项目
import django
django.setup()
from app01 import models
# 查询所有的人
ret = models.Person.objects.all()
print(ret)
# get 查询
ret2 = models.Person.objects.get(id=1) # 有个不好的地方:如果id值不存在会报错!
ret3 = models.Person.objects.get(name="阿猛") # 有个不好的地方:如果id值不存在会报错!
print(ret2)
print(ret3)
# filter
ret4 = models.Person.objects.filter(name="阿猛")
print(ret4)
ret5 = models.Person.objects.filter(id=1)
# filter 和 get的区别 后者返回的是一个对象,前者返回是的Django给你封装好的一个列表
print(ret5)
ret6 = models.Person.objects.filter(id=1)[0] # 就算查询的结果只有一个 返回的也是QuerySet,我们要用索引的方式取出来
print(ret6)
ret7 = models.Person.objects.filter(id=100) # filter的id如果不存在 不会报错 也是跟get的区别
print(ret7)
ret8 = models.Person.objects.filter(id__gt=1) # id>1
print(ret8)
# 几乎不用get()方法 都是用filter() 因为filter不会报错
print(" exclude ".center(100, "*"))
# exclude 把符合条件的排除掉
ret9 = models.Person.objects.exclude(id=1)
print(ret9)
print(" values ".center(100, "*"))
# values 返回一个QuerySet对象,里面都是字典,不写字段名,默认查询所有字段
ret10 = models.Person.objects.values("name", "birthday")
print(ret10)
print(" values_list ".center(100, "*"))
# values_list 返回一个QuerySet对象,里面都是元祖,不写字段名,默认查询所有字段
ret10 = models.Person.objects.values_list("name", "birthday")
print(ret10)
print(" order_by ".center(100, "*"))
# order_by 按照指定的字段排序 默认按照id排序
ret10 = models.Person.objects.order_by("birthday")
print(ret10)
ret10 = models.Person.objects.all()
print(ret10)
# reverse 将一个有序的QuerySet 反转顺序
# 对有序的QuerySet才能调用reverse
print(" reverse ".center(100, "*"))
ret10 = models.Person.objects.order_by("birthday").reverse()
print(ret10)
ret10 = models.Person.objects.reverse()
print(ret10)
ret10 = models.Person.objects.all()
print(ret10)
print(" count ".center(100, "*"))
# 得到的是一个具体的数字
ret10 = models.Person.objects.all().count()
print(ret10)
print(" first ".center(100, "*"))
# 返回第一个对象
ret10 = models.Person.objects.all().first()
print(ret10)
# 返回最后一个对象
ret10 = models.Person.objects.all().last()
print(ret10)
print(" exists ".center(100, "*"))
# 判断表里有没有数据
ret10 = models.Person.objects.exists()
print(ret10)
以上是必知必会的
以下也是必知必会的
单表查询之神奇的下划线
# 查询id值大于1小于4的结果
ret = models.Person.objects.filter(id__gt=1, id__lt=4)
print(ret)
# in 查询id值在[1,3,5,7]中的结果
ret = models.Person.objects.filter(id__in=[1, 3, 5, 7])
print(ret)
# 查询id值不在[1,3,5,7]中的结果
ret = models.Person.objects.exclude(id__in=[1, 3, 5, 7])
print(ret)
# contains 包含"阿"的
ret = models.Person.objects.filter(name__contains="阿")
print(ret)
# icontains 包含"阿"的 忽略大小写包含指定值 对中文无效
ret = models.Person.objects.filter(name__icontains="阿")
print(ret)
# range
# 判断id值 在 哪个区间的 SQL语句中的between and
ret = models.Person.objects.filter(id__range=[1, 3])
# 日期和时间字段 还可以单独有一下写法
ret = models.Person.objects.filter(birthday__year="2019") # 加不加引号都可以
print(ret)
ret = models.Person.objects.filter(birthday__year=2019)
print(ret)
ret = models.Person.objects.filter(birthday__month="3")
print(ret)
ret = models.Person.objects.filter(birthday__year=2019, birthday__month="3")
print(ret)
外键的跨表查询shou
首先在publisher表插入几条数据,然后在book表中插入几条数据
1.正向查找
book_obj = models.Book.objects.all().first()
# 和我这本书关联的出版社对象
ret = book_obj.publisher
print(ret, type(ret))
# 和我这本书关联的出版社对象的名称
ret = book_obj.publisher.name
print(ret, type(ret))
# 利用双下划线跨表查询
ret = models.Book.objects.filter(id=1).values("publisher__name") # 双下划线表示跨一张表
print(ret)
ret = models.Book.objects.filter(id=1).values_list("publisher__name") # 双下划线表示跨一张表
print(ret)
2.反向查询
# 1.基于对象查询
publisher_obj = models.Publisher.objects.first()
ret = publisher_obj.book_set.all()
print(ret)
related_name="books" #反向查询 用来代替book_set
ret = publisher_obj.books.all()
print(ret)
# 2.基于双下划线查询
ret = models.Publisher.objects.filter(id=1).values_list("books__title")
print(ret)