2018-9-13 14:23:22
ORM那些事 参考 : https://www.cnblogs.com/liwenzhou/p/8660826.html
今天的都是ORM的查询 更详细进阶了!
越努力,与幸运!永远不要高估自己!
day69 2018-05-11 1. ORM增删改查操作 http://www.cnblogs.com/liwenzhou/p/8660826.html 1. 单表增删改查 2. 单表的双下划线操作 3. 外键的跨表查询 1. 正向查询 2. 反向查询 4. 多对多的跨表查询 1. 正向查询 2. 反向查询 5. 分组和聚合 6. F和Q 7. 事务 8. 执行原生SQL语句 饲养员 还让 老母猪 笑话着了。 作业: 把ORM查询操作多写几个例子!!! 后面的项目: 1. BBS 仿博客园 练手的 2. CRM --> 权限系统、Django admin、 Startk组件 3. 路飞学城 --> Django REST Framework(API) --> Vue(MVVM框架) 4. Flask --> 发布系统 5. 爬虫 6. 算法+金融那些 7. Linux
正向与反向查 根据外键
# /usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/9/13 14:19 # @Author : TrueNewBee """ 如何在一个python脚本或文件中 加载Django项目的配置和变量的信息 ORM 查询的方法 2018-9-13 21:49:26 """ import django import os from app001 import models if __name__ == '__main__': # 加载Django项目的配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite67.settings") django.setup() # 查询所有的人 person = models.Person.objects.all() print(person) # get查询 如果查询条件不存在,则会报错 ret = models.Person.objects.get(name='小黑') print(ret) # filter 不存在 返回一个空的QuerySet,不会报错 ret = models.Person.objects.filter(name='小黑') print(ret) # 就算查询的结果只有一个,返回的也是QuerySet,我们要用索引的方式取出第一个元素 ret = models.Person.objects.filter(id=1)[0] print(ret) # exclude ret = models.Person.objects.exclude(id=1) print(ret) print('values'.center(80, "*")) # values 返回一个QuerySet对象 里面都是字典,不写字段名,默认查询所有字段 ret = models.Person.objects.values("name", "birthday") print(ret) print('values_list'.center(80, "*")) # values 返回一个QuerySet对象 里面都是元组,不写字段名,默认查询所有字段 ret = models.Person.objects.values_list() print(ret) print('order_by'.center(80, "*")) # order_by 按照指定的字段排序 ret = models.Person.objects.all().order_by("birthday") print(ret) print('reverse'.center(80, "*")) # reverse 将一个有序的QuerySet,反转顺序 # 对有序的QuerySet才能调用 ret = models.Person.objects.all().order_by("birthday").reverse() print(ret) print('count'.center(80, "*")) # count 返回QuerySet中对象的数量 ret = models.Person.objects.all().count() print(ret) print('first'.center(80, "*")) # first 返回QuerySet中第一个对象 ret = models.Person.objects.all().first() print(ret) print('last'.center(80, "*")) # last 返回QuerySet中最后一个对象 ret = models.Person.objects.all().last() print(ret) print('exists'.center(80, "*")) # exists 判断表里面有没有数据 ret = models.Person.objects.exists() print(ret) # ---------------------------------------------------------------------------------------------------------- # 单标查询之神奇的双下划线 # 查询id值大于1小于4的结果 ret = models.Person.objects.filter(id__gt=1, id__It=4) print(ret) # in # 查询 id在 [1,3,5]中的结果 ret = models.Person.objects.filter(id__in=[1, 3, 5]) print(ret) # 查询 id不在在 [1,3,5]中的结果 ret = models.Person.objects.exclude(id__in=[1, 3, 5]) print(ret) # contains 字段包含指定值 # icontains 忽略大小写字段包含指定值 ret = models.Person.objects.exclude(name_contains="小") print(ret) # range # 判断id值在 哪个区间的SQL语句中的between and 1<= <=3 ret = models.Person.objects.filter(id__range=[1, 3]) print(ret) # 日期和时间字段还可以有以下写法 ret = models.Person.objects.filter(birthday__year=2018) print(ret) ret = models.Person.objects.filter(birthday__month=5) print(ret) # ----------------------------------------------------------------------------------------------- # 外键的查询操作 # 正向查询 # 基于对象, 跨表查询 book_obj = models.Book.objects.all().first() ret = book_obj.pubilsher # 和我这本书关联的出版社对象 print(ret, type(ret)) ret = book_obj.publisher.name # 和我这本书关联的出版社对象 print(ret, type(ret)) # 查询id是1的书的出版社的名称 # 利用双下划线 跨表查询 # 双下划线就表示垮了一张表 ret = models.Book.objects.filter(id=1).values_list("publisher_name") print(ret) # 反向查询 # 1.基于对象查询 publisher_obj = models.Publisher.objects.get(id="1") # 得到的是一个具体的对象 ret = publisher_obj.book_set.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) # 查询金老板写过的书 ret = author_obj.books.all() # print(author_obj.books, type(author_obj.books)) print(ret) # 1.create # 通过作者创建一本书,会自动保存 # 做了两件事 # 1. 在book表中创建了一本新书, 2, 在作者和书得关系列把你中添加关联记录 author_obj.books.create(tittle="金老板自传", 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) # 要把列表打散再传进去 author_obj.books.add(9) # remove # 从金老板关联的书里面把 开飞船 删掉 book_obj = models.Book.objects.get(title="跟金老板学开飞机") author_obj.books.remove(book_obj) # 从金老板关联的书里面把id是8的记录 删掉 # author_obj.books.remove(8) # clear # 清空 # 把景女神 关联的所有书都删掉 # jing_obj = models.Author.objects.get(id=2) # jing_obj.books.clear() # 额外补充的, 反键的反向操作 # 找到id是1的出版社 publisher_obj = models.Publisher.objects.get(id=1) publisher_obj.books.clear() # ---------------------------------------------------------------------------------------------- # 聚合 from django.db.models import Avg, Sum, Max, Min, Count ret = models.Book.objects.all().aggregate(price_avg=Avg("price")) print(ret) ret = models.Book.objects.all().aggregate(price_avg=Avg("price"), price_max=Max("price"), price_Min=Min("price")) # --------------------------------------------------------------------------- # 分组查询 # 查询每一本书的的作者个数 ret = models.Book.objects.all().annotate(author_num=Count("author")) print(ret) for book in ret: print("书名: {}, 作者数量: {}".format(book.title, book.authorr_num)) # ----------------------------------------------------------------------------------------- # 查询各个作者出的书的总价格 # 这是一个对象列表 # ret = models.Author.objects.all().annotate(price_sum=Sum("books_price")).values_list("id", "name", "price_sum") ret = models.Author.objects.all().annotate(price_sum=Sum("books_price")) for i in ret: print(i, i.name, i.price_sum) print(ret.values_list("id", "name", "price_sum")) # ----------------------------------------------------------------------------- # F和Q ret = models.Book.objects.filter(price_gt=99.9) print(ret) # 查询出 库存数 大于 卖出书的 所有书(两个字段作比较) from django.db.models import F ret = models.Book.objects.filter(kucun_gt=F("maichu")) print(ret) # 刷单 把一本书的卖出数都乘以3 obj = models.Book.objects.first() obj.maichu = 1000*3 obj.save() # 具体的对象没有update(), QuerySet对象才有update() models.Book.objects.update(maichu=F("maichu")*3) # 给每一本书的书名后面加上第一版 from django.db.models.functions import Concat from django.db.models import Value # models.Book.objects.update(title=Concat(F("title")), Value("第一版")) # ------------------------------------------------------------------------------ # Q查询 from django.db.models import Q # 查询 卖出数大于1000, 并且, 价格小于100的所有书 ret = models.Book.objects.filter(maichu_gt=1000, price_lt=100) print(ret) # 查询卖出书大于1000, 或者加个小于100的所有的书 ret = models.Book.objects.filter(Q(maichu_gt=1000)| Q(price_lt=100)) print(ret) # Q查询和字段查询同时存在时, 字段查询要放在Q查询的后面 ret = models.Book.objects.filter(Q(maichu_gt=1000)| Q(price_lt=100), title_contains="金老板") print(ret)