zoukankan      html  css  js  c++  java
  • Day20

    一、如何配置django测试脚本

    1.为什么要使用测试脚本

    当我们写好了model层数据之后,想要对数据库进行操作。那么如果直接运行Django,就还需要将数据显示在前端,为了方便,我们使用测试脚本,将数据直接显示在tests文件里(测试脚本)

    2.如何创建测试脚本

    第一种 直接在某一个应用下的tests文件中书写下面内容(去manage.py拷贝前四行代码) 然后自己写两行代码即可

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

    脚本代码

    from django.test import TestCase

    if __name__ == "__main__":
       import os,django

       os.environ.setdefault("DJANGO_SETTINGS_MODULE", "blog.settings")
       django.setup()

       from ygy import models

    注意导入models必须在django.setup()的下面,要不然找不到这个models

     

    二、创建数据的两方法

    1.sava方法,当创建了model对象之后,使用save将数据保存到数据库里

    2.create创建对象的同时将数据插到数据库里

    3.日期(DateField)创建的两个选项:

    auto_now:创建时保存时间

    auto_now_add :修改时保存时间

    三、删除数据的delete方法

    要想删除指定数据,首先要使用get或者fliter方法,

    使用get如果没有拿到对象就会报错;

    models.Books.objects.get(pk=3).delete()
    models.Books.objects.filter(pk=3).delete()

    四、查看orm操作对应的sql语句

    在setting里面设置:

     

    五、必知必会十三条

    1.all()查询所有的orm数据

    1. all()  查询所有        
    #返回的结果QuerySet对象# 
    res = models.Books.objects.all(
    print(res)
    """
    orm语句的查询默认都是惰性查询
    只有当你真正要使用数据的时候才会执行orm语句
    """

     

    1. filter()

      #筛选 相当于你原生sql语句里面的 where关键字     返回的结果QuerySet对象
      res = models.Books.objects.filter(pk=1,title='三')  # 支持多个参数 并且是and关系
      print(res)

     

    3.get()

    #    筛选  获取的是数据对象本身  条件不存在直接报错  并且查询条件必须是唯一的数据对象# 
    res = models.Books.objects.get(title='西游记')

     

    4.first()

    #取queryset中第一个数据对象     
    res = models.Books.objects.filter(title='西游记').first()
    print(res.price)

     

    5.last()

    取queryset中最后一个数据对象    
    res = models.Books.objects.filter(title='西游记').last()
    print(res.price)

     

    6.count()

    统计数据的个数   
    num = models.Books.objects.count()
    print(type(num))

     

    7.values()

    获取数据对象中指定的字段的值  可以有多个参数  queryset  列表套字典
    res = models.Books.objects.values('title','price')
    print(res)
    # <QuerySet [{'title': '三国演义', 'price': Decimal('222.66')}, {'title': '红楼梦', 'price': Decimal('888.99')}, {'title': '西游记', 'price': Decimal('444.66')}, {'title': '西游记', 'price': Decimal('666.22')}]>

     

    1. values_list()

    # 获取数据对象中指定的字段的值  可以有多个  queryset  列表套元祖
    res = models.Books.objects.values_list('title','price')
    print(res)
    # <QuerySet [('三国演义', Decimal('222.66')), ('红楼梦', Decimal('888.99')), ('西游记', Decimal('444.66')), ('西游记', Decimal('666.22'))]>

     

    9.order_by()

    #按照指定的字段排序# 
    res = models.Books.objects.order_by('price')  # 默认是升序
    res1 = models.Books.objects.all().order_by('price')  # 默认是升序   两者等价 下面的方式 语义更明确
    # 降序  字段前面加负号
    res1 = models.Books.objects.all().order_by('-price')

     

    10.reverse()

    #颠倒顺序   前提是跌倒的对象必须有顺序(提前排序之后才能跌倒)# 
    res = models.Books.objects.all()
    res1 = models.Books.objects.all().reverse()
    res2 = models.Books.objects.all().order_by('price')
    res3 = models.Books.objects.all().order_by('price').reverse()
    print(res2,res3)

     

    11.exclude()

    #排除什么什么之外   queryset对象
    res = models.Books.objects.all().exclude(title='三国演义')
    print(res)
    # <QuerySet [<Books: 红楼梦>, <Books: 西游记1>, <Books: 西游记2>]>

     

    12.exists()

    #判断查询结果是否有值 返回结果是一个布尔值
    res = models.Books.objects.filter(pk=1).exists()
    print(res)# 该方法其实不需要使用  因为数据本身自带布尔值

     

    13.distinct()

    # 对查询结果进行去重操作 去重的前提:数据必须是完全想要的情况下 才能够去重(你容易忽略主键)
    res = models.Books.objects.values('title','price')
    res1 = models.Books.objects.values('title','price').distinct()
    print(res)

     

    六、神器的双下换线查询

    	__gt 大于
        # 查询价格大于500的书籍
        # res = models.Books.objects.filter(price__gt=500)
        # print(res)
        __lt 小于
        # 查询价格小于400 的书籍
        # res = models.Books.objects.filter(price__lt=400)
        # print(res)
        __gte 大于等于 (对浮点数判相等无效)
        # 查询价格大于等于500
        # res = models.Books.objects.filter(price__gte=444.66)  对数字精确度不敏感
        # res = models.Books.objects.filter(price__gte=500)
        # print(res)
        __lte 大于等于 (对浮点数判相等无效)
        # 查询价格小于等于500的书籍
        # res = models.Books.objects.filter(price__lte=500)
        # print(res)
    in 等于列表里的一个值
        # 查询价格是222.66或者444.22或者500的书籍
        # res = models.Books.objects.filter(price__in=[222,444,500])
        # print(res)
    range 等于元组范围的值 开区间
        # 查询价格在200到800之间的书籍
        # res = models.Books.objects.filter(price__range=(200,800))  # 顾头顾尾
        # print(res)
    year 筛选年份
        # 查询出版日期是2019年的书籍
        # res = models.Books.objects.filter(publish_date__year='2019')
        # print(res)
        month 筛选月份
        # 查询出版日期是1月份的书籍
        # res = models.Books.objects.filter(publish_date__month='1')
        # print(res)

     

    七、模糊查询

        """
        MySQL中的模糊查询
            关键字 like
                模糊匹配的符号
                    %:匹配任何个数的任意字符
                    _:匹配一位任意的字符
        """
        startwith 开头
        # 查询书籍是以三开头的书
        # res = models.Books.objects.filter(title__startswith='三')
        # print(res)
        endwith 结尾
        # 查询书籍是以义结尾的书
        # res = models.Books.objects.filter(title__endswith='1')
        # print(res)
        contains 包含 (区分大小写)
        # 查询书籍名称中包含游字的书籍
        # res = models.Books.objects.filter(title__contains='游')
        # print(res)
    icontanis 包含(忽略大小写)
        # 查询书籍名称中包含字母p的书籍
        # res = models.Books.objects.filter(title__contains='p')  # 默认区分大小写
        # res = models.Books.objects.filter(title__icontains='p')  # 忽略大小写 加i
        # print(res)

     

    八、一对多字段的增删改

         增
        # 第一种
        models.Book.objects.create(title='三国演义',price=222.33,publish_id=1)
        # 直接传表里面的实际字段 跟数据主键值  publish_id
        # 第二种
         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=publish_obj)

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

     

    九、多对多字段的增删改

         增
         book_obj = models.Book.objects.filter(pk=2).first() #获取设置了Many2Many的A表
     print(book_obj.authors)  #通过用.选择ManytoMany字段,此时已经跨到被添加关系的B表
         book_obj.authors.add(1)  # 在第三张表里面给书籍绑定一个主键为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)
        # 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,]) #通关列表传单个值
         book_obj.authors.set((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) #直接删除一个值
         book_obj.authors.remove(1,2)#删除两个值
         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()#清空数据库
        """
        clear清空书籍相关所有记录  括号内不需要传递参数 
        """

     

    十、跨表查询

    """
    正反向查询
            关系字段在谁哪 由谁查谁就是正向
            如果关系字段 就是反向
        正向查询按字段
        反向查询按表名小写 + _set
    """

    """
    inner join
    outter 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.查询作者是egon的家庭地址
        # res = models.Author.objects.filter(name='egon').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)

        # 查询书籍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)

    =======================================================================================

    1.多对多,多对一,一对一,本质上都是外键,都是默认级联关系

    image-20191127202545888.png

    on_delete官方文档:https://docs.djangoproject.com/en/2.2/ref/models/fields/#arguments

    on_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字段需要设置默认值,一对一同理)
    on_delete = models.SET,  # 删除关联数据,
    # a. 与之关联的值设置为指定值,设置:models.SET(值)
    # b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

     

    2.设置级联删除后,如何删除数据

    image-20191127203506774.png

     

    3.查询优化

    https://www.cnblogs.com/mangM/p/11483161.html

     

    4.测试脚本的第三种写法,写一个类继承与TestCase,这个类里的方法都会被, Django test,进行测试

    image-20191127182555218.png 

  • 相关阅读:
    [WARNING] 找不到编译器:wepy-compiler-less。 [Error] 未发现相关 less 编译器配置,请检查wepy.config.js文件。
    wepy-cli : Failed to download repo standard: getaddrinfo ENOENT raw.githubusercontent.com
    火币Huobi 币安 Binance ios 反编译
    iPhone 反编译-微信多开分身版原理,一部iPhone登录多个微信号
    安卓微信分身版 一部手机同时登录多个微信号 原理
    微信smali反编译 查看撤回消息
    微信抢红包
    Dota2 荒神罪 破解
    微信smali反编译 语音消息转发功能
    mac安装mysql流程
  • 原文地址:https://www.cnblogs.com/ygy1997/p/11945615.html
Copyright © 2011-2022 走看看