美文网首页
Django 五

Django 五

作者: 吃可爱长大鸭 | 来源:发表于2021-04-20 15:22 被阅读0次

    目录

    1.Django 模板的导入
    2.Django 模板的继承
    3.Django 搭建测试环境
    4.Django 单表查询关键字
    5.Django 双下划綫查询(范围查询)
    6.Django 图书管理系统表设计
    7.Django 外键操作
    8.Django 跨表查询理论
    9.Django 基于对象的跨表查询
    10.Django 基于双下划线的跨表查询
    

    1.Django 模板的导入

    # 类似于后端到模块 想要什么局部页面直接导入即可
    
    {% include 'myform.html' %}
    

    2.Django 模板的继承

    先使用block划定区域
    母版
        {% block 区域名称 %}
        {% endblock %}
    子版
        {% extends 'home.html' %}
        {% block 区域名称 %}
        {% endblock %}
      
    母版在划定区域的时候一般都应该有三个区域
       css区域
       html文档区域
       js区域
       ps:目的是为了让子版具有独立的css js等 增加扩展性
        {% block css %}
    
        {% endblock %}
        
        {% block content %}
    
        {% endblock %}
        
        {% block js %}
    
        {% endblock %}
     
    ps:子版也可以继续使用母版划定区域内的内容
        {{ block.super }}
    

    3.Django 搭建测试环境

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

    4.Django 单表查询关键字

    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)
    
        # 11.返回QuerySet对象的方法有
        all()
        filter()
        exclude()
        order_by()
        reverse()
        distinct()
        # 12.特殊的QuerySet
        values()       返回一个可迭代的字典序列
        values_list() 返回一个可迭代的元祖序列
        # 13.返回具体对象的
        get()
        first()
        last()
        # 14.返回布尔值的方法有:
        exists()
        # 15.返回数字的方法有
        count()
    

    5.Django 双下划綫查询(范围查询)

    # 在查询字段加上下面的语法
    __gt #大于
     models.Books.objects.filter(price__gt=700)
    
    __lt  #小于
    models.Books.objects.filter(price__lt=700)
    
    __gte #大于等于
    models.Books.objects.filter(price__gte=700)
    
    __lte  #小于等于
    models.Books.objects.filter(price__lte=700)
    
    __in  #连接...要么
    models.Books.objects.filter(price__in=[666.66,999.66,10000])
    
    #python对数字不是很敏感 精确度不高  很多时候我们会采取字符串存储数字类型
    
    __range #多少之间
    models.Books.objects.filter(price__range=(500,800))
    
    __contains #包含的字符串
    models.Books.objects.filter(title__contains='s')
    models.Books.objects.filter(title__icontains='s')  # 区分大小写
    
    __year #按年查询
    models.Books.objects.filter(publish_time__year=2021)
    
    __month #按月查询
    models.Books.objects.filter(publish_time__month=3)
    

    6.图书管理系统表设计

    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实现
    """
    # django 2.0版本需要加no_delete参数
    
    on_delete=None,        # 删除关联表中的数据时,当前表与其关联的field的行为
    
    
    on_delete=models.CASCADE,        # 删除关联数据,与之关联也删除
    
    
    on_delete=models.DO_NOTHING,  # 删除关联数据,什么也不做
    
    
    on_delete=models.PROTECT,         # 删除关联数据,引发错误ProtectedError
    
    
    # models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)
    on_delete=models.SET_NULL,        # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理)
    
    
    # models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')
    on_delete=models.SET_DEFAULT,  # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理)
    

    7.Django 外键操作

    # 1.直接传主键值
    models.Book.objects.create(title='太阳', price=666.64,publish_id=1)
    # 2.传外键表数据对象
    publish_obj = models.Publish.objects.filter(pk=1).first()
    models.Book.objects.create(title='下雨', price=666.32, publish=publish_obj)
    # 一对多
    # 改  
    models.Book.objects.filter(pk=1).update(publish=2)
    models.Book.objects.filter(pk=2).update(publish_id=3)
    
    #多对多
    add()
    remove()
            括号内既可以传数字也可以传对象,逗号隔开即可
    set()
            括号内必须传递可迭代对象 可迭代对象内既可以传数字也可以传对象 支持多个
    clear()
            清空操作 无需传值
    

    8.Django 跨表查询理论

    正向
        外键字段在谁那儿,谁查另外的人就是正向
    反向
        没有外键字段
    # 就是判断你是否有关联的外键字段
    
    """
    正向查询按外键字段
    反向查询按表名小写
                _set
    """
    all()   #查询不止一个的时候加上all()
    

    9.Django 基于对象的跨表查询

    # 子查询
    """
    1.先查询出一个对象
    2.基于对象点正反向字段
    3.基于对象的跨表查
        -子查询,多次查询
    """
    
    反向查询表明小写加_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)
    

    10.Django 基于双下划线的跨表查询

    基于双下划线的跨表查
        -多表连接查询
    # 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)
    

    相关文章

      网友评论

          本文标题:Django 五

          本文链接:https://www.haomeiwen.com/subject/vujnlltx.html