zoukankan      html  css  js  c++  java
  • day 53小结

    如何配置测试脚本

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

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

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

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

    给表创建数据的两种方式

    ​ 方式一 (create方法)

        book_obj = models.Books.objects.create(title='水浒传',price=333,publish_date=date.today())
    
    

    ​ 方式二 (利用对象的绑定方法)

    book_obj = models.Books(title='西游记',price=666,publish_date='2000-1-22')
    book_obj.save()	 # 该方法不推荐使用	推荐使用queryset方法
    # 利用对象的修改 内部其实是重头到尾将数据的所有字段都重新写一遍
    

    查询

    res = models.Books.objects.filter(pk=1)
    print(res)
    print(res.query)
    '''
    pk会自动帮你查找到当前表的主键字段  所以后期我们都是用pk来指代主键字段
    	filter查询出来的结果是一个Queryset对象
    1.只要是queryset对象就可以无限制的调用queryset的方法
    2.只要是queryset对象就可以点query查看当前结果内部对应的sql语句
    '''
    

    book_obj = models.Books.objects.get(pk=1)
    print(book_obj)
    '''
    get和filter区别
    1.filter获取到的是一个queryset对象   类似于一个列表
    	当条件不存在会返回空
    2.get获取的直接就是数据对象本身
    	当条件不存在会报错
    '''
    

    删除 (一般不使用)

    一 利用queryset方法 delete()

    models.Books.boject.filter(pk=3).delete()
    

    二 对象方法

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

    Django终端打印SQL语句

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console':{
                'level':'DEBUG',
                'class':'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {
                'handlers': ['console'],
                'propagate': True,
                'level':'DEBUG',
            },
        }
    }
    
    

    必知必会13条

    orm语句的查询默认都是惰性查询
    只有当你真正要使用数据的时候才执行orm语句

    1 all() 查询所有

    models.Books.objects.all()

    2 filter() 筛选 相当于你原生sql语句里面的 where关键字

    res = models.Books.objects.filter(pk=1,title=‘三’) 支持多个参数 并且是and关系

    3 get() 筛选 获取的是数据对象本身 条件不存在直接报错 并且只能查询一个

    res = models.Book.objects.get(pk=1)

    4 first() 取queryset中第一个数据对象 数据对象

    res = models.Book.objects.filter(title=‘西游记’).first()

    5 last() 取queryset中最后一个数据对象 数据对象

    res = models.Book.objects.filter(title=‘西游记’).last()

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

    num = models.Books.ojects.count()

    7 values() 获取数据对象中指定的字段值 可以多个 queryset 列表套字典

    res = models.Books.objects.values(‘title’,‘price’)

    8 values_list() 获取数据对象中指定字段的值 可以有多个 queryset 列表套元组

    res = models.Books.objects.values_list(‘title’,‘price’)

    9 order_by() 按照指定的字段排序

    res = models.Books.objects.order_by(‘price’) 默认升序

    res = models.Books.objects.all().order_by(‘price’) 两者等价 下方语义更明确

    ​ 降序 字段前面加 -

    res = models.Books.objects.all().order_by(‘-price’)

    10 reverse() 颠倒顺序 前提是颠倒的对象必须有顺序(前提排序之后才能颠倒顺序)

    res = models.Books.objects.all()

    res1 = models.Books.objects.all().reverse()

    11 exclude() 排除什么什么之外 queryset对象

    res = models.Books.objects.all().exclude(title=‘三国演义’)

    12 exists() 判断查询结果是否有值 返回一个布尔值

    res = models.Books.objcts.filter(pk=1).exists()

    ​ 该方法其实不需要使用 因为数据本身自带布尔值

    13 distinct() 对查询结果进行去重操作 去重的前提:数据必须是完全相同的情况下 才能去重

    res = models.Books.objects.values(‘title’,‘price’).distinct()

    神奇的双下划线查询

    大于 __gt

    res = models.Books.objects.filter(price__gt=500)

    小于 __lt

    res = models.Books.objects.filter(price__lt=500)

    大于等于 __gte

    res = models.Books.objects.filter(price__gte=500)

    小于等于 __lte

    res = models.Books.objects.filter(price__lte=500)

    或者 __in

    res = models.Books.objects.filter(price__in=[100,200])

    之间 __range (顾头顾尾)

    res = models.Books.objects.filter(price__range=(200,800))

    日期

    ​ 年份 __year

    res = models.Books.objects.filter(price_date_year='2019')

    ​ 月份 __month

    res = models.Books.objects.filter(price_date__month='1')

    以什么开头

    __startswith

    以什么结尾

    __endswith

    包含

    __contains (区分大小写)

    __icontains (不区分大小写)

    创建表

    class Books(models.Model):
        title = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=8,decimal_places=2)
        publish_date = models.DateField(auto_now_add=True)
        '''
        自动创建时间
        auto_now: 每次修改数据的时候都会修改时间   展示最近修改的时间
        auto_now_add:当数据创建出来的时候 会自动将创建时间记录下来
        '''
        authors = models.ManyToManyField(to='Author')
        publish = models.ForeignKey(to='Publish')
        
        
    class Publish(models.Model):
        name = models.CharField(max_length=32)
        addr = models.CharField(max_length=64)
    
    
    class Author(models.Model):
        name = models.CharField(max_length=32)
        email = models.EmailField()  # 对应到数据库中仅仅是varchar(254)   没有任何限制条件  该字段只要是字符串就行
        # 仅仅是为了表达语义 需要后期借助校验性组件限制
        author_detail = models.OneToOneField(to='AuthorDetail')
    
    
    class AuthorDetail(models.Model):
        phone = models.CharField(max_length=32)
        addr = models.CharField(max_length=64)
    
    

    一对多字段的增删改查

    ​ 第一种

    models.Book.objects.create(title=‘三国演义’,price=223,publish,id=1) 直接传表里的实际对象 publish_id

    ​ 第二种

    publish_obj = models.Publish.objects.filter(pk=2).first()
    models.Books.objects.create(title='红楼梦',price=444,publish=publish_obj)
    
    

    ​ 第一种

        models.Books.objects.filter(pk=1).update(publish=2)
    
    

    ​ 第二种

    publish_obj = models.Publish.object.filter(pk=1),first()
    models.Book.objects.filter(pk=1).update(publish_id=publish)
    
    

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

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

    book_obj = models.Book.object.filter(pk=2),first()
    print(book_obj.publish)	点外键字段可能会获取到外键关联的数据对象
    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,author1)
    
    

    book_obj = models.Book.objects.filter(pk=2).first()
    book_obj.author.set((1,3))
    '''
    set修改多对多关系表中的数据
    即可一串数字也可以传对象
    但是需要注意的是括号内必须是可迭代对象
    都支持多个
    '''
    
    

    book_obj = models.Book.objects.filter(pk=2).first()
    book_obj.author.remove(1)
    
    

    清空

    book_obj = models.Book.objects.filter(pk=2).first()
    book_obj.authors.clear()
    
    

    跨表查询

    基于对象的跨表查询 子查询

    boook_obj = models.Book.objects.filter(pk=2).first()
    print(book_obj.publish)
    print(book_obj.publish.name)
    
    book_obj = models.Book.objetcs.filter(pk=4).first()
    print(book_obj.authors.all())
    
    
    
    

    什么时候加all
    当正向查询点击外键字段数据有多个的情况下 需要加all()
    app01.Author.None 一旦看见该结果 只需加.all()即可

    基于双下划线的链表查询 多表联查

    res = models.Book.objets.filter(pk=2).values('publish_name')
    
    models.Book.objects.filter(pk=2).values('authors__name')
    models.Author.objects.filter(book__id=2).values('name')
    
    res = models.Book.objet.filter(pk=2).values('authors__author_detail__phone')
    
    models.Book.objects.filter(pk=2).values('外键字段1__外键字段2__外键字段3...')  # 基于该方法可以无限跨表
    
    

    正反向查询

    ​ 关系字段在谁哪 由谁查谁就是正向
    ​ 如果关系字段不在 就是反向

    ​ 正向查询按字段
    ​ 反向查询按表名小写 + _set
    ​ 一对多 加 _set
    ​ 多对多 加 _set

    ​ 一对一 不加

  • 相关阅读:
    Python中的下划线(转)
    全面Python小抄(转)
    Python函数参数默认值的陷阱和原理深究(转)
    Python中的默认参数(转)
    PEP8 Python 编码规范整理(Python)
    PEP8中文翻译(转)
    这次面试就差不多了,你有什么问题需要问我呢?(转)
    MySQL事务隔离级别,锁(转)
    Web安全学习图径——系列课程推荐
    盗墓笔记—阿里旺旺ActiveX控件imageMan.dll栈溢出漏洞研究
  • 原文地址:https://www.cnblogs.com/LZF-190903/p/11968414.html
Copyright © 2011-2022 走看看