Django 模型层

import os


if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day60Django.settings")
    import django
    django.setup()

    from app01 import models

    # res = models.Book.objects.all()
    # print(res)  #<QuerySet []>
    # 单表操作,增删改查
    # 单表的增
    # 方式一
    # create(属性1='属性值1',属性2='属性值2',属性3='属性值3')
    # res = models.Book.objects.create(title='九阴真经', price=123.12, publish_date='2019-10-24')
    # print(res)
    # from datetime import date
    # ctime = date.today() # 获取当前日期
    # res = models.Book.objects.create(title='jpm', price=66.99, publish_date=ctime)
    # print(res)

    # 方式二  类实例化创建对象
    # book_obj = models.Book(title='三国演义', price=11.11, publish_date='2018-11-11')
    # book_obj.save()

    # 改
    # 方法一 update(属性=属性值)
    # res = models.Book.objects.filter(pk=4).update(price=999)
    # print(res)

    #方法二  对象的赋值,对属性重新赋值
    # book_obj = models.Book.objects.filter(pk=5).first()
    # book_obj.title = '水浒传'
    # book_obj.save()

    # 删  delete()
    # models.Book.objects.filter(pk=6).delete()
    
# 查询方式之十三太保
    # 查  查询方法之十三太保
    # 1.all() 查询所有   QuerySet
    # res = models.Book.objects.all()  # 惰性查询,就是要给它赋值后在打印,不然打印不出来
    # print(res) #<QuerySet [<Book: 九阴真经>, <Book: 水浒传>, <Book: 三国演义>]>

    # 2.filter()  QuerySet
    # res = models.Book.objects.filter(pk=5)
    # print(res)  #<  [<Book: 水浒传>]>

    # 3.get() 得到的是数据对象本身
    # res = models.Book.objects.get(pk=7)
    # print(res) # Book object
    # print(res.title) # 三国演义

    #4. first() 拿第一个
    # res = models.Book.objects.all()
    # print(res) #<QuerySet [<Book: 九阴真经>, <Book: 水浒传>, <Book: 三国演义>]>
    # print(res.first()) #九阴真经

    #5. last()  拿最后一个
    # print(res.last())  #三国演义

    #6. exclude()  除此之外   #QuerySet
    # res = models.Book.objects.exclude(pk=5)
    # res = models.Book.objects.exclude(pk=5).filter(pk=7)
    # print(res) #<QuerySet [<Book: 三国演义>]>

    #7.values()     QuerySet   根据传入的参数获取到参数值 得到的结果是 列表套字典
    # res = models.Book.objects.values('title')
    # ret = models.Book.objects.values('price')
    # print(res)
    # print(ret)

    #8. values_list()   QuerySet 根据传入的参数获取到参数值 得到的结果是 列表套元组
    # res = models.Book.objects.values_list('title')
    # print(res) #<QuerySet [('九阴真经',), ('水浒传',), ('三国演义',)]>
    # print(res[0]) #('九阴真经',)

    #9. count() 统计数据个数
    # ret = models.Book.objects.all()
    # res = models.Book.objects.count()
    # print(ret)  #<QuerySet [<Book: 九阴真经>, <Book: 水浒传>, <Book: 三国演义>]>
    # print(res)  #3

    # 10.distinct() 去重  QuerySet
    '''去重必须所有数据都一样,包括 id,但可以指定参数后进行去重 '''
    # res = models.Book.objects.all().distinct()
    # print(res)  # 无法去重
    # ret = models.Book.objects.values('title', 'price').distinct()
    # print(ret)

    # 11. order_by()  默认是 升序
    # res = models.Book.objects.all().order_by('price')
    # ret = models.Book.objects.order_by('-price')  #加 负号就是降序
    # print(res)
    # print(ret)

    # 12. reverse() 反转排序  #前面必须先是排序的结果后才可以反转(先排序后反转)
    # res = models.Book.objects.order_by('price').reverse()
    # print(res)

    # 13. exists() 判断是否存在
    # res = models.Book.objects.filter(pk=2).exists()
    # print(res) #False
    res = models.Book.objects.filter(pk=5).exists()
    print(res)  #True

神奇的双下划线

'''神奇的双下线查询'''
    # 查询价格大于200的书籍   __gt 大于
    # res = models.Book.objects.filter(price__gt=200)
    # print(res) #<QuerySet [<Book: 九阴真经>, <Book: 哆啦A梦>]>

    # 查询价格小于200的书籍   __lt 小于
    # res = models.Book.objects.filter(price__lt=200)
    # print(res)

    # 查询价格大于或者等于200的书籍   __gte 大于等于
    # res = models.Book.objects.filter(price__gte=66.99)
    # print(res)

    # 查询价格小于或者等于200的书籍   __lte 小于等于
    # res = models.Book.objects.filter(price__lte=66.99)
    # print(res)

    # 查询价格是11.11 或 333.33 或 66.99   __in 在什么之间选一个
    # res = models.Book.objects.filter(price__in=[11.11, 333.33, 66.99])
    # print(res)

    # 价格在1到50之前  __range  在什么范围之间
    # res = models.Book.objects.filter(price__range=(10,50))
    # print(res) #<QuerySet [<Book: 三国演义>, <Book: 三国演义>, <Book: jpm>]>

模糊匹配

# 模糊匹配
    '''mysql里面是:
    like
    %
    _
    '''
    # 查询书籍名称中包含三字的  __contains 包含......
    # res = models.Book.objects.filter(title__contains='三')
    # print(res) #<QuerySet [<Book: 三国演义>, <Book: 三国演义>]>

    # 忽略大小写  __icontains 忽略大小写
    # res = models.Book.objects.filter(title__icontains='p')
    # print(res) #<QuerySet [<Book: 三国演义P>, <Book: 三国演义p>]>

    # 查询书籍名称是以三开头的书籍  __startswith() 以...开头
    # res = models.Book.objects.filter(title__startswith='三')
    # print(res) #<QuerySet [<Book: 三国演义P>, <Book: 三国演义p>]>

    # 查询书籍名称是以 p 结尾的书籍  __endswith()  以..结尾
    # res = models.Book.objects.filter(title__endswith='p')
    # print(res) #<QuerySet [<Book: 三国演义p>]>

    # 查询出版日期是2019年的书籍
    # res = models.Book.objects.filter(publish_date__year='2019')
    # print(res) #<QuerySet [<Book: 九阴真经>, <Book: 水浒传>, <Book: 哆啦A梦>]>

    # 查询出版日期是11月的书籍
    res = models.Book.objects.filter(publish_date__month='11')
    print(res) #<QuerySet [<Book: 三国演义P>, <Book: 三国演义p>]>

多表查询

import os


if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "many_search.settings")
    import django
    django.setup()
    from app01 import models
    # 一对多字段增删改查
    # models.Book.objects.create(title='三国演义',price=123.23,publish_id=1)  # publish_id直接传出版社主键值

    # publish_obj = models.Publish.objects.filter(pk=2).first()
    # models.Book.objects.create(title='水浒传',price=123.23,publish=publish_obj)  # publish直接传出版社数据对象

    # 查
    # book_obj = models.Book.objects.filter(pk=1).first()
    # print(book_obj.publish)  # 获取到当前所对应的出版社对象
    # print(book_obj.publish_id)  # 获取到的就是表中的实际字段

    # 改
    # models.Book.objects.filter(pk=1).update(publish_id=3)
    # publish_obj = models.Publish.objects.filter(pk=2).first()
    # models.Book.objects.filter(pk=1).update(publish=publish_obj)

    # 删除
    # models.Publish.objects.filter(pk=2).delete()
    # 默认也是级联更新 级联删除

    # 多对多字段的增删改查

    # 给主键为3的书籍添加两个作者 1 2
    # book_obj = models.Book.objects.filter(pk=3).first()
    # # print(book_obj.authors)  # 就相当于 已经在书籍和作者的关系表了
    # # book_obj.authors.add(1)
    # # book_obj.authors.add(2,3)
    # 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() 括号内既可以传数字也可以传数据对象
    并且都支持传多个
    """


    # 修改关系
    # book_obj = models.Book.objects.filter(pk=3).first()
    # # book_obj.authors.set([3,])
    # # book_obj.authors.set([1,3])
    # author_obj = models.Author.objects.filter(pk=1).first()
    # author_obj1 = models.Author.objects.filter(pk=2).first()
    # book_obj.authors.set((author_obj,))
    # book_obj.authors.set((author_obj,author_obj1))
    """
    set() 括号内 既可以传数字也传对象 
    并且也是支持传多个的
    但是需要注意 括号内必须是一个可迭代对象
    """

    # 删
    # book_obj = models.Book.objects.filter(pk=3).first()
    # # book_obj.authors.remove(2)
    # # 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() 括号内 既可以传数字也传对象 
    并且也是支持传多个的
    """
    # 清空
    # book_obj = models.Book.objects.filter(pk=3).first()
    # book_obj.authors.clear()
    """clear()括号内不需要传任何参数 直接清空当前书籍对象所有的记录"""


    """
    ORM跨表查询
        1.子查询
        2.连表查询
        
    正反向的概念
        外键字段在谁那儿 由谁查谁就是正向
        
        谁手里有外键字段 谁就是正向查
        没有外键字段的就是反向
        书籍对象 查  出版社    外键字段在书籍       正向查询
        出版社 查 书籍         外键字段在书籍       反向查询
        
        
        正向查询按字段
        反向查询按表名小写 ...
        
    """
    # 1.基于对象的跨表查询    子查询
    # 1.查询书籍是python入门的出版社名称
    # book_obj = models.Book.objects.filter(title='python入门').first()
    # # 正向查询按字段
    # print(book_obj.publish.name)
    # print(book_obj.publish.addr)
    # 2.查询书籍主键是6的作者姓名
    # book_obj = models.Book.objects.filter(pk=6).first()
    # # print(book_obj.authors)  # app01.Author.None
    # print(book_obj.authors.all())
    # 3.查询作者是jason的手机号
    # author_obj = models.Author.objects.filter(name='jason').first()
    # print(author_obj.author_detail.phone)
    # print(author_obj.author_detail.addr)
    """
    正向查询 按字段 
    当该字段所对应的数据有多个的时候 需要加.all()
    否者点外键字段直接就能够拿到数据对象
    """
    # 4.查询出版社是东方出版社出版过的书籍
    # publish_obj = models.Publish.objects.filter(name='东方出版社').first()
    # # print(publish_obj.book_set)  # app01.Book.None
    # print(publish_obj.book_set.all())
    # 5.查询作者是jason写过的所有的书
    # author_obj = models.Author.objects.filter(name='jason').first()
    # # print(author_obj.book_set)  # app01.Book.None
    # print(author_obj.book_set.all())
    # 6.查询手机号是110的作者
    # author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first()
    # print(author_detail_obj.author)
    # print(author_detail_obj.author.name)
    # print(author_detail_obj.author.age)
    """
    反向查询按表名小写 
        什么时候需要加_set
            当查询的结果可以是多个的情况下 需要加_set.all()
        什么时候不需要加_set
            当查询的结果有且只有一个的情况下 不需要加任何东西 直接表名小写即可
    """
    # 7.查询书籍是python入门的作者的手机号
    # book_obj = models.Book.objects.filter(title='python入门').first()
    # print(book_obj.authors.all())

    # 2.基于双下划綫的跨表查询   连表查询
    """
    MySQL
        left join
        inner join
        right join
        union
    """
    # 1.查询书籍是python入门的出版社名称
    # 正向
    # res = models.Book.objects.filter(title='python入门').values('publish__name')
    # print(res)
    # 反向
    # res = models.Publish.objects.filter(book__title='python入门').values('name')
    # print(res)


    # 2.查询作者是jason的手机号码
    # 正向
    # res1 = models.Author.objects.filter(name='jason').values('author_detail__phone')
    # print(res1)
    # 反向
    # res = models.AuthorDetail.objects.filter(author__name='jason').values('phone','author__age')
    # print(res)



    # 3.查询手机号是120的作者姓名

    # res2 = models.AuthorDetail.objects.filter(phone=120).values('author__name')
    # print(res2)
    # res = models.Author.objects.filter(author_detail__phone=120).values('name','author_detail__addr')
    # print(res)


    # 4.查询出版社是东方出版社出版的书籍名称
    # res = models.Publish.objects.filter(name='东方出版社').values('book__title','addr')
    # print(res)
    # 5.查询作者是jason的写过的书的名字和价格
    # res = models.Author.objects.filter(name='jason').values('book__title','book__price')
    # print(res)

    # 7.查询书籍是python入门的作者的手机号
    # res = models.Book.objects.filter(title='python入门').values('authors__author_detail__phone')
    # print(res)