细说Django中ORM 的增删改查操作

首先新建一个Django项目,并在mysql中新建数据,然后再settings.py中配置数据库信息,别忘了在项目下的__init__.py文件下加上:
在这里插入图片描述
我在models.py文件中新建几个类:
加粗样式
新建完成之后 在Terminal 里跑两条语句:

  1. python manage.py makemigrations
  2. python manage.py migrate

然后 我在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)

外键的跨表查询

首先在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)

在这里插入图片描述

多对多

作者和书是一个多对多的关系,多对多需要三张表来做关联,所以还需要作者和书的关系表。
在作者表和书集表中添加数据,在作者和书籍表中也添加数据
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

    # 多对多
    # 查询
    author_obj = models.Author.objects.first()
    print(author_obj.name)
    #     查询李老板写过的书
    ret = author_obj.books.all()
    print(author_obj.books, type(author_obj.books))
    print(ret)
    # 1.create  会自动保存 不用提交
    # 通过作者创建一本书
    # 做了两件事
    # 1.在book表里创建新书 1.在作者和书的关系表中添加关联记录
    author_obj.books.create(title="三重门", publisher_id=2)
    # 2. add
    # 在李老板关联的书里 再加一本id是4的书
    book_obj = models.Book.objects.get(id=4)
    author_obj.books.add(book_obj)
    # 添加多个
    book_objs = models.Book.objects.filter(id__gt=5)
    author_obj.books.add(*book_objs)  # 要把列表打散 再传进去
    # 直接添加id
    author_obj.books.add(10)
    # remove
    # 从李老板关联的书里面把  跟大猛学讲笑话讲笑话删掉
    book_obj = models.Book.objects.get(title="跟大猛学讲笑话")
    author_obj.books.remove(book_obj)
    # 从李老板关联的书里面把 id 是8的删掉
    author_obj.books.remove(8)
    # clear 清空
    jin_obj = models.Author.objects.get(id=2)
    jin_obj.books.clear()
    # 额外补充的,外键的反向操作
    # 找到id是1 的出版社
    publisher_obj = models.Publisher.objects.get(id=1)
    publisher_obj.books.clear()
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值