zoukankan      html  css  js  c++  java
  • DAY 49 django04

     

    • settings源码

      熟读并表述出来
    • 模板语法传值

      1.字典
      2.locals()

      1.传函数名和类名的时候都会自动加括号调用
      2.不支持传递额外的参数
    • 过滤器

      |add
      |length
      |default
      |date
      |truncatewords
      |turncatechars
      |fileseizeformat
      |safe
    • 标签

      for循环
      forloop
         empty
      if判断

      with起别名

      """
      {{}}变量相关
      {%%}逻辑相关
      """
    • 自定义过滤器、标签、inclusion_tag

      1.templatetags文件夹
      2.任何名称py文件
      3.固定写两句话
    • 模板导入

      {% include '模板名称' %}
    • 模板继承

      {% extends '母版名称' %}


      {% block '区域名称'%}
      {% endblock %}

      # 母版最好有三个及以上区域
      css
         content
         js
    • django测试环境搭建

    • 单表查询关键字

    • 神奇的双下划綫查询

    • 图书管理系统表设计

    • 外键字段的增删改查

    • 基于对象的跨表查询(子查询)

    • 基于下划线的跨表查询(连表查询)

    • 聚合查询

    • 分组查询

    • F与Q查询

    django测试环境搭建

    ps:
       1.pycharm链接数据库都需要提前下载对应的驱动
       2.自带的sqlite3对日期格式数据不敏感
      如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3
           
    # 方式1:任意创建一个py文件,在该文件内书写固定的配置
    import os
    if __name__ == "__main__":
       os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day06.settings")
       import django
       django.setup()
    # 方式2:直接使用pycharm提供的python console

    单表查询关键字

    QuerySet对象方法
    query # 查看orm内部对应的SQL语句

    # 增
    # res = models.Books.objects.create(title='西游记',price=687.90)
    # print(res.title)
    '''create返回值就是当前被创建的数据对象'''
    # 查
    # res = models.Books.objects.all()
    # print(res.query)
    # res = models.Books.objects.filter()
    # print(res.query)
    # res = models.Books.objects.filter(title='jason')
    # print(res)
    """filter括号内可以放多个参数 默认是and关系 推荐使用 条件不符合不会报错"""
    # res1 = models.Books.objects.get(title='jason')
    # print(res1)
    """get括号内可以放多个参数 默认是and关系 不推荐使用 条件不符合直接报错"""
    # 改
    # res = models.Books.objects.filter(pk=1).update(price=666.66)
    # print(res) # 返回值是受影响的行数

    # book_obj = models.Books.objects.filter(pk=2).first()
    # book_obj.price = 999.66
    # book_obj.save() # 效率低(所有字段重新写一遍)
    """pk能够自动查找到当前表的主键字段 我们不需要查看当前表主键字段名"""
    # 删
    # models.Books.objects.filter(pk=1).delete()

    # 1.first() 取第一个数据对象
    # res = models.Books.objects.all().first()
    # res1 = models.Books.objects.all()[0]
    # res2 = models.Books.objects.all()[0:2]
    # print(res,res1,res2)
    """QuerySet对象还支持切片操作 但是只能填正数"""
    # 2.last() 取最后一个数据对象
    # res = models.Books.objects.all().last()
    # print(res)
    # 3.values() 获取数据指定字段的值
    # res = models.Books.objects.all().values('title','publish_time')
    # res1 = models.Books.objects.values('title','publish_time')
    # print(res,res1)
    """all()加不加都表示所有数据 values获取的结果 类似于列表套字典"""
    # 4.values_list() 获取数据指定字段的值
    # res = models.Books.objects.values_list('title', 'publish_time')
    # print(res)
    """values_list获取的结果 类似于列表套元组"""
    # 5.order_by() 排序
    # res = models.Books.objects.order_by('price') # 默认是升序
    # print(res)
    # res1 = models.Books.objects.order_by('-price') # 减号降序
    # print(res1)
    # 6.count() 计数
    # res = models.Books.objects.count() # 统计数据条数
    # print(res)
    # 7.distinct() 去重
    # res = models.Books.objects.all().distinct()
    # res1 = models.Books.objects.values('title').distinct()
    # print(res1)
    """去重的前提是数据必须是一模一样 一定不能忽略主键"""
    # 8.exclude() 排除什么什么在外 取反操作
    # res = models.Books.objects.exclude(title='西游记')
    # print(res.query)
    # 9.reverse()
    # res = models.Books.objects.all()
    # res1 = models.Books.objects.reverse()
    # res2 = models.Books.objects.order_by('price').reverse()
    # print(res)
    # print(res1)
    # print(res2)
    """reverse需要先排序之后才能反转"""
    # 10.exists() 判断是否有数据 返回布尔值
    # res = models.Books.objects.all().exists()
    # print(res)

    神奇的双下划綫查询(范围查询)

    # 1.查询价格大于700的书籍
    # res = models.Books.objects.filter(price__gt=700)
    # print(res)
    # print(res.query)
    # 2.查询价格小于700的书籍
    # res = models.Books.objects.filter(price__lt=700)
    # print(res)
    # print(res.query)
    # 价格大于等于700 小于等于700
    # res1 = models.Books.objects.filter(price__gte=700)
    # res2 = models.Books.objects.filter(price__lte=700)
    # print(res1.query,res2.query)
    # 3.查询价格要么是666.66 要么是999.66 要么是10000
    # res = models.Books.objects.filter(price__in=[666.66,999.66,10000])
    # print(res)
    """python对数字不是很敏感 精确度不高 很多时候我们会采取字符串存储数字类型"""
    # 4.查询价格在500到800之间的
    # res = models.Books.objects.filter(price__range=(500,800))
    # print(res.query)

    # 5.查询书名中包含字母s的书
    # res = models.Books.objects.filter(title__contains='s') # 区分大小写
    # print(res.query)
    # res = models.Books.objects.filter(title__icontains='s') # 区分大小写
    # print(res)

    # 6.查询出版日期是2021的书
    # res = models.Books.objects.filter(publish_time__year=2021)
    # print(res.query)
    # 7.查询出版日期是3月的书
    # res = models.Books.objects.filter(publish_time__month=3)
    # print(res)

    图书管理系统表设计

    class Book(models.Model):
    title = models.CharField(verbose_name='书名', max_length=32)
    price = models.DecimalField(verbose_name='价格', max_digits=8, decimal_places=2)
    publish_time = models.DateField(verbose_name='出版日期',auto_now_add=True)
    # 一对多 外键字段建在多的一方
    publish = models.ForeignKey(to='Publish')
    # 多对多 外键字段推荐建在查询频率较高的表中
    authors = models.ManyToManyField(to='Author')


    class Publish(models.Model):
    title = models.CharField(verbose_name='名称',max_length=32)
    addr = models.CharField(verbose_name='地址',max_length=128)
    email = models.EmailField(verbose_name='邮箱')


    class Author(models.Model):
    name = models.CharField(verbose_name='姓名',max_length=32)
    age = models.IntegerField(verbose_name='年龄')
    # 一对一 外键字段推荐建在查询频率较高的表中
    author_detail = models.OneToOneField(to='AuthorDetail')


    class AuthorDetail(models.Model):
    phone = models.BigIntegerField(verbose_name='电话')
    addr = models.CharField(verbose_name='地址',max_length=32)

    """
    作者详情表
    作者表
    出版社表

    书籍表和关系表通过orm实现
    """

    外键字段操作

    
    

    跨表查询理论

    正向
    外键字段在谁那儿,谁查另外的人就是正向
    反向
    没有外键字段
    # 就是判断你是否有关联的外键字段

    """
    正向查询按外键字段
    反向查询按表名小写
    _set
    """

    基于对象的跨表查询

    # 子查询
    """
    1.先查询出一个对象
    2.基于对象点正反向字段
    """

    反向查询表明小写加_set
    查询的对象可能有多个的情况
    查询的对象只有一个的情况不需要加
    基于对象的跨表查询
    1.查询聊斋书籍对应的出版社名称
    book_obj = models.Book.objects.filter(title='聊斋').first()
    res = book_obj.publish
    print(res.title)

    2.查询神雕侠侣对应的作者
    book_obj = models.Book.objects.filter(title='神雕侠侣').first()
    # res = book_obj.authors # app01.Author.None
    res = book_obj.authors.all()
    print(res)


    3.查询jason的地址
    author_obj = models.Author.objects.filter(name='jason').first()
    res = author_obj.author_detail
    print(res.phone,res.addr)

    4.查询东方出版社出版过的书籍
    publish_obj = models.Publish.objects.filter(title='东方出版社').first()
    # res = publish_obj.book_set # app01.Book.None
    res = publish_obj.book_set.all() # app01.Book.None
    print(res)

    5.查询jason写过的书
    author_obj = models.Author.objects.filter(name='jason').first()
    # res = author_obj.book_set # app01.Book.None
    res = author_obj.book_set.all()
    print(res)

    6.查询电话是110的作者姓名
    author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first()
    res = author_detail_obj.author
    print(res.name,res.age)

    基于双下划线的跨表查询

    # 连表操作
    #############################################################################
       # 基于对象的跨表查询
       # 1.查询聊斋书籍对应的出版社名称
       # book_obj = models.Book.objects.filter(title='聊斋').first()
       # res = book_obj.publish
       # print(res.title)
       #
       # 2.查询神雕侠侣对应的作者
       # book_obj = models.Book.objects.filter(title='神雕侠侣').first()
       # # res = book_obj.authors # app01.Author.None
       # res = book_obj.authors.all()
       # print(res)
       #
       #
       # 3.查询jason的地址
       # author_obj = models.Author.objects.filter(name='jason').first()
       # res = author_obj.author_detail
       # print(res.phone,res.addr)
       #
       # 4.查询东方出版社出版过的书籍
       # publish_obj = models.Publish.objects.filter(title='东方出版社').first()
       # # res = publish_obj.book_set # app01.Book.None
       # res = publish_obj.book_set.all() # app01.Book.None
       # print(res)
       #
       # 5.查询jason写过的书
       # author_obj = models.Author.objects.filter(name='jason').first()
       # # res = author_obj.book_set # app01.Book.None
       # res = author_obj.book_set.all()
       # print(res)
       #
       # 6.查询电话是110的作者姓名
       # author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first()
       # res = author_detail_obj.author
       # print(res.name,res.age)

       ########################################################################
       # 基于双下划线查询
       # 1.查询聊斋书籍对应的出版社名称
       # res = models.Book.objects.filter(title='聊斋').values('publish__title')
       # print(res.query)
       # 2.查询神雕侠侣对应的作者名字和年龄
       # res = models.Book.objects.filter(title='神雕侠侣').values('authors__name','authors__age')
       # print(res)
       # 3.查询jason的地址
       # res = models.Author.objects.filter(name='jason').values('author_detail__addr')
       # print(res)

       # 1.查询聊斋书籍对应的出版社名称
       # res = models.Publish.objects.filter(book__title='聊斋').values('title')
       # print(res)
       # 2.查询神雕侠侣对应的作者名字和年龄
       # res = models.Author.objects.filter(book__title='神雕侠侣').values('name','age')
       # print(res)
       # 3.查询jason的地址
       # res = models.AuthorDetail.objects.filter(author__name='jason').values('addr')
       # print(res)


       # 查询神雕侠侣对应的作者的电话和地址
       res = models.Book.objects.filter(title='神雕侠侣').values('authors__author_detail__phone','authors__author_detail__addr')
       print(res)

     

  • 相关阅读:
    获取cookie
    EF数据迁移(当模型改变时更新数据库)
    EF有外键的查询
    EF查询
    前台主页面给子页面赋值(回调)
    jquery取元素值
    chart画图
    IIS 7.0 的 ASP.NET 应用程序生命周期概述(转载)
    查询服务器登录个数
    gridview中判断隐藏还是现实
  • 原文地址:https://www.cnblogs.com/DEJAVU888/p/14893579.html
Copyright © 2011-2022 走看看