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

首先新建一个Django项目,并在mysql中新建数据,然后再settings.py中配置数据库信息,别忘了在项目下的__init__.py文件下加上:
细说Django中ORM 的增删改查操作
我在models.py文件中新建几个类:
细说Django中ORM 的增删改查操作
新建完成之后 在Terminal 里跑两条语句:

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

然后 我在person中加了几条数据
细说Django中ORM 的增删改查操作

做好了以上工作,我们就可以练习增删改查操作了
你可以打开python Console操作,话不多说,直接上图
细说Django中ORM 的增删改查操作
但是使用这种有个缺点就是不能保存下来
所以,我新建了一个Python文件
细说Django中ORM 的增删改查操作

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)

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