11.27 总结

Posted lidandanaa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11.27 总结相关的知识,希望对你有一定的参考价值。

模型层

orm查询

  • 如何配置测试脚本

方法一:直接在某一个应用下的test文件中书写下面内容(先去manage.py拷贝前四行代码,然后写下面两行代码)

import os

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day53s.settings")
    
    import django
    django.setup()
    
    #一定要等待测试脚本搭建完毕之后 才能导入django文件进行测试

方法二:直接新建一个任意名称的py文件 在里面也写上面的配置 也可以配置

单表操作 13条

#先创建数据
    #1.create方法
    book_obj=models.Books.objects.create(title='历代帝王',price=383.45,publish_date='2019-2-3')
    print(book_obj)
    from datetime import date
    ctime=date.today()
    book_obj=models.Books.objects.create(title='一生别离',price=463.55,publish_date=ctime)
    print(book_obj)
    #2.利用对象的绑定方法
    book_obj=models.Books(title='厉害的人,从来不靠情绪表达自己',price=288.98,publish_date='2000-3-2')
    book_obj.save()
#修改数据
    res=models.Books.objects.filter(pk=1)
  • pk会自动帮你查找到当前表的主键字段 所以我们都用pk来指代主键字段。
  • filter查询出来的结果是一个QuerySet对象
    • 只要是QuerySet对象 就可以无限制的调用QuerySet的方法
    • 只要是QuerySet对象就可以点query查看当前结果内部对应的SQL语句
#修改数据
res=models.Books.objects.filter(pk=1)

print(res.query)
SELECT `app01_books`.`id`, `app01_books`.`title`, `app01_books`.`price`, `app01_books`.`publish_date` FROM `app01_books` WHERE `app01_books`.`id` = 1

    #方式一 利用QuerySet方法 
    models.Books.objects.filter(pk=1).update(price=345.67)
    #方式2 利用对象
    book_obj=models.Books.objects.get(pk=1)
    book_obj.price=456.78
    book_obj.save() #该方法不推荐使用 推荐使用queryset方法
#利用对象的修改 内部其实是从头到尾将数据的所有字段重新写一遍
  • get和filter区别
    • filter获取到的是一个queryset对象 类似于一个列表
    • get获取到的直接就是数据对象本身
    • 当条件不存在的情况下
      • filter不报错直接返回一个空 推荐使用filter方法
      • get直接报错索引不推荐使用get方法
 #删除数据
    #1.利用queryset方法 delete()
    models.Books.objects.filter(pk=3).delete()
    #2.对象方法
    book_obj=models.Books.objects.get(pk=2)
    book_obj.delete()
  • 查数据

  • 如果你想查看所有orm语句内部对应的SQL语句 你可以直接在配置文件中配置相应的代码即可
  • all() 查询所有 返回的结果是QuerySet对象

    res= models.Books.objects.all()
    print(res)
  • orm语句的查询默认都是惰性查询,只有当你真正要使用数据的时候才会执行orm语句

  • filter() 筛选 相当于原生的SQL语句里面的where关键字 返回的结果是QuerySet对象

res=models.Books.objects.filter(pk=1,title='历代帝王') #支持多个参数 并且是and关系
print(res)
  • get() 筛选 获取的是数据对象本身 条件不存在直接报错 并且查询条件必须是唯一的
    res=models.Books.objects.get(title='历代帝王')
    res1=models.Books.objects.filter(title='历代帝王')
    print(res,res1)
    
    历代帝王 <QuerySet [<Books: 历代帝王>]>
  • first() 取queryset中第一个数据对象 数据对象
 res=models.Books.objects.filter(title='历代帝王').first()
 print(res.price)
  • last() 取queryset中最后一个数据对象 数据对象

  • count() 统计数据的个数 数字

    num=models.Books.objects.count()
    print(num)
    print(type(num))
  • values() 获取数据对象中指定的字段的值 可以有多个 queryset 列表套字典
    res=models.Books.objects.values('title','price')
    print(res)
    
    <QuerySet [{'title': '历代帝王', 'price': Decimal('456.78')}]>
  • values_list() 获取数据对象中指定的字段的值 可以有多个 queryset 列表套元组
res = models.Books.objects.values_list('title', 'price')
print(res)

<QuerySet [('历代帝王', Decimal('456.78'))]>
  • order_by() 按照指定的字段排序
 res=models.Books.objects.order_by('price') #默认升序
    res1=models.Books.objects.all().order_by('price') #默认升序 两者等价 下面的方式 语义更明确
    #降序 字段前面加负号
    res2 = models.Books.objects.all().order_by('-price')
    print(res2)
  • reverse 颠倒顺序 前提是颠倒的对象必须有顺序(提前排序之后才能颠倒)
 res=models.Books.objects.all().reverse()
    res1=models.Books.objects.all().order_by('price')
    res2=models.Books.objects.all().order_by('price').reverse()
 print(res,res1,res2)
  • exclude() 排除...之外
res = models.Books.objects.all().exclude(title='风之影')
print(res)
  • exists() 判断查询结果是否有值 返回结果是一个布尔值
 res=models.Books.objects.filter(pk=1).exists()
 print(res)

#该方法其实不需要使用 因为数据本身自带布尔值
  • distinct() 对查询结果进行去重操作 去重的前提是数据必须是完全相同的前提下
res1 = models.Books.objects.values('title', 'price').distinct()
    print(res1)

双下划线查询

#查询价格大于500的书籍
    res=models.Books.objects.filter(price__gt=500)
    print(res)
# 查询价格小于400的书籍
    res = models.Books.objects.filter(price__lt=400)
    print(res)
# 查询价格大于等于500的书籍
    res =models.Books.objects.filter(price__gte=500)
    print(res)
# 查询价格小于等于500的书籍
    res =models.Books.objects.filter(price__lte=500)
    print(res)
# 查询价格是523.56或者456.78或者500的书籍
    res = models.Books.objects.filter(price__in=[523.56,456.78,500])
    print(res)
    
# 查询价格在200到600之间的书籍
    res = models.Books.objects.filter(price__range=(200,600))
    print(res)
    
# 查询出版日期在2018年的书籍
    res = models.Books.objects.filter(publish_date__year='2018')
    print(res)
    
# 查询出版日期在1月份的书籍
    res = models.Books.objects.filter(publish_date__month='1')
    print(res)

模糊查询

mysql中的模糊查询:关键字 like

模糊匹配的符号 :%匹配任何个数的任意字符 _匹配一位任意的字符

 # 查询名字以风开头的书籍
    res = models.Books.objects.filter(title__startswith='风')
    print(res)
    
  # 查询名字以王结尾的书籍
    res = models.Books.objects.filter(title__endswith='王')
    print(res)
     
 # 查询名字包含女人的书籍
    res = models.Books.objects.filter(title__contains='女人')
    print(res)
    
  # 查询名字包含字母p的书籍
    res = models.Books.objects.filter(title__contains='p') 
    #默认区分大小写
res1=models.Books.objects.filter(title__icontains='p')  #想要忽略大小写 加i
    print(res1)

一对多字段数据的增删改查

  • auto_now:每次修改数据的时候 都会自动更新修改书籍(展示最新的一次修改时间)
  • auto_now_add:当数据被创建出来的时候 会自动将创建时间记录下来
#增
    #第一种
    models.Book.objects.create(title='年轮',price=333.45,publish_id=1)
    #第二种
    publish_obj=models.Publish.objects.filter(pk=2).first()
    models.Book.objects.create(title='红楼梦',price=444.33,publish=publish_obj)   #传虚拟字段 跟数据对象即可
    
 #改
    #第一种
    models.Book.objects.filter(pk=1).update(publish_id=2)
    #第二种
    publish_obj = models.Publish.objects.filter(pk=1).first()
    models.Book.objects.filter(pk=1).update(publish_id=publish_obj)
    
  #删
    models.Publish.objects.filter(pk=1).delete()  #默认就是级联删除 级联更新

多得多字段的增删改查

#增
    book_obj=models.Book.objects.filter(pk=2).first()
    print(book_obj.publish) 
    #点外键字段 可能会直接获取到外键关联的数据对象
    
   #给当前的书绑定作者
    方式一:
    # print(book_obj.authors)  #app01.Author.None
    book_obj.authors.add(1) #在第三张表里面给书籍绑定一个主键为1的作者
    book_obj.authors.add(1,2)
    
     方式二:author_obj=models.Author.objects.filter(pk=1).first()
   author_obj1=models.Author.objects.filter(pk=2).first()

    book_obj.authors.add(author_obj)
    book_obj.authors.add(author_obj,author_obj1)
  • add方法 能够朝第三张关系表添加数据
    • 即支持传数字 add(1,2)
    • 也支持传对象 add(author_obj,author_obj1)
    • 并且两者都可以是多个
#改
 方法一:
 book_obj=models.Book.objects.filter(pk=2).first()
    book_obj.authors.set((1,3))
    book_obj.authors.set([1,])
 方法二:
 author_obj=models.Author.objects.filter(pk=1).first()
    author_obj1=models.Author.objects.filter(pk=2).first()

 book_obj.authors.add(author_obj,author_obj1)
 
  • set修改多对多关系表中的数据,既可以传数字也可以传对象,但是需要注意的是括号内必须是可迭代对象,都支持多个
    • set((1,3))
    • set((author_obj,author_obj1))
 #删
 方法一:  book_obj=models.Book.objects.filter(pk=2).first()
    book_obj.authors.remove(1,2)
    
 方法二:
author_obj = models.Author.objects.filter(pk=1).first()
    author_obj1 =   models.Author.objects.filter(pk=2).first()
    book_obj.authors.remove(author_obj)
    book_obj.authors.remove(author_obj,author_obj1)
  • remove 既可以传数字 也可以传对象,并且都支持多个 不需要迭代
    • remove(1,2)
    • remove(author_obj,author_obj1)
  • 清空 删除某个数据在第三张表中的所有记录
 book_obj = models.Book.objects.filter(pk=2).first()
 book_obj.authors.clear()

跨表查询

  • 正向查询:关系字段在谁那 由谁查谁就是正向
  • 反向查询:由没有关系字段的表查有关系字段的
  • 正向查询按字段
  • 反向查询按表名小写+_set
# 基于对象的跨表查询         子查询  分步操作
# 1.查询书籍主键为2的出版社名称 从书表到出版社 多对一是正向
book_obj = models.Book.objects.filter(pk=2).first()
print(book_obj.publish)  # 出版社对象
print(book_obj.publish.name)

# 2.查询书籍主键为2的作者姓名
book_obj = models.Book.objects.filter(pk=2).first()
print(book_obj.authors)  # app01.Author.None
print(book_obj.authors.all())
#<QuerySet [<Author: ldd>, <Author: zqf>]>

# 3.查询作者是ldd的手机号码
author_obj = models.Author.objects.filter(name='ldd').first()
print(author_obj.author_detail)
print(author_obj.author_detail.phone)
  • 什么时候需要加all 当正向查询点击外键字段数据有多个的情况下 需要.all()
  • app01.Author.None 一旦看到该结果 只需要加.all()即可
  • 在写orm语句的时候跟你写sql语句一样 不要想着一次性写完写一点查一点再写一点
4.查询出版社是东方出版社出版过的书籍
    publish_obj = models.Publish.objects.filter(name='东方出版社').first()
    # print(publish_obj.book_set)  # app01.Book.None
    print(publish_obj.book_set.all())

    5.查询作者是ldd写过的书籍
    author_obj = models.Author.objects.filter(name='ldd').first()
    # print(author_obj.book_set)  # app01.Book.None
    print(author_obj.book_set.all())  # app01.Book.None

    6.查询手机号是120的作者姓名
    author_detail_obj = models.AuthorDetail.objects.filter(phone=120).first()
    print(author_detail_obj.author)
    print(author_detail_obj.author.email)
  • 什么时候反向查询的时候表名小写需要加_set
    • 一对多
    • 多对多
    • 一对一不需要加

基于双下划线的跨表查询 联表操作

  • inner join
  • left join
  • right join
  • union
 # 1.查询书籍pk为2的出版社名称
    # 正向
    res = models.Book.objects.filter(pk=2).values('publish__name')  # 写外键字段就相当于已经跨到外键字段所关联的表
    # 你想要改表的哪个字段信息 你只需要加__获取即可
    print(res)
    # 反向
    res = models.Publish.objects.filter(book__pk=2).values('name')
    print(res)
    
    
    # 2.查询书籍pk为2的作者姓名和邮箱
    res = models.Book.objects.filter(pk=2).values('authors__name','authors__email')
    print(res)
    res = models.Author.objects.filter(book__pk=2).values('name','email')
    print(res)
    """
    models后面点的谁 就以谁为基表
    """
    
    # 3.查询作者是xdd的家庭地址
    res = models.Author.objects.filter(name='xdd').values('author_detail__addr')
    print(res)
    res = models.AuthorDetail.objects.filter(author__name='egon').values('addr')
    print(res)
    
    
     # 4.查询出版社是东方出版社出版过的书的名字
    res = models.Publish.objects.filter(name='东方出版社').values('book__title')
    print(res)
    res = models.Book.objects.filter(publish__name='东方出版社').values('title')
    print(res)
    
     # 5.查询书籍pk是2的作者的手机号
    res = models.Book.objects.filter(pk=2).values('authors__author_detail__phone')
    print(res)
    res = models.Author.objects.filter(book__pk=2).values('author_detail__phone')
    print(res)

以上是关于11.27 总结的主要内容,如果未能解决你的问题,请参考以下文章

11.27

python常用代码片段总结

11.25 配置防盗链 11.26 访问控制Directory 11.27 访问控制FilesMat

11.27号

BootStrap有用代码片段(持续总结)

11.27 linux