zoukankan      html  css  js  c++  java
  • day51 Django的ORM增删改查

    day51 Django的ORM增删改查

    内容补充

    Django静态文件配置

    Django的静态文件在settings.py中的配置一般是这样的:

    STATIC_URL = '/static/'
    
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR,'statics'), #文件夹名称尽量不要和别名的名称冲突
    ]
    

    静态文件的另外一种引入方式

    {% load static %}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    </head>
    <body>
    
    </body>
    <script src="{% static 'jquery.js' %}"></script>
    <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
    </html>
    

    携带数据按钮

    编辑按钮携带数据,主要是通过get请求和路径参数的方式:

    <a href="{% url 'book_edit' %}?book_id={{ book.id }}" class="btn btn-warning btn-sm">编辑</a>
    
    <a href="/book/edit/{{ book.id }}/" class="btn btn-warning btn-sm">编辑</a>
    
    <a href="{% url 'book_edit' book.id %}" class="btn btn-warning btn-sm">编辑</a>
    

    带参url反向解析

    url别名反向解析时如果需要参数,HTML代码中可以在别名后直接加上参数:

    {% url '别名' 3 %}
    

    实际上在模板渲染时,路径被渲染为/index/3/的形式。所以,在路由分发时,我们可以使用正则传参的方式,把参数传递给视图函数:

    url(r'^index/(d+)/',views.index,name='index');
    

    如果在views视图反向解析时需要传入参数,我们只需增加arg参数即可:

    reverse('index',args=(3,))    # /index/3/
    

    13个查询接口

    all()

    查询所有结果,结果是queryset类型

    filter(**kwargs)

    它包含了与所给筛选条件相匹配的对象,结果也是queryset类型:

    Book.objects.filter(title='linux',price=100)
    

    里面的多个条件用逗号分开,并且这几个条件必须都成立,是and的关系,or关系的我们后面再学,直接在这里写是搞不定or的。

    除了直接使用objects对象外,还可以使用queryest使用filter方法:

    ret = models.UserInfo.objects.all().filter() 
    

    get(**kwargs)

    返回与所给筛选条件相匹配的对象,不是queryset类型,是行记录对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。捕获异常try。

    Book.objects.get(id=1)
    

    exclude(**kwargs)

    排除的意思,它包含了与所给筛选条件不匹配的对象,没有不等于的操作昂,用这个exclude,返回值是queryset类型

    Book.objects.exclude(id=6)
    

    返回id不等于6的所有的对象,或者在queryset基础上调用

    Book.objects.all().exclude(id=6)
    

    order_by(field)

    queryset类型的数据来调用,对查询结果排序,默认是按照id来升序排列的,返回值还是queryset类型

    models.Book.objects.all().order_by('price','id')
    

    直接写price,默认是按照price升序排列,按照字段降序排列,就写个负号就行了,也就是 order_by('-price')order_by('price','id') 是多条件排序,按照price进行升序,price相同的数据,按照id进行升序

    reverse()

    queryset类型的数据来调用,对查询结果反向排序,返回值还是queryset类型

    count()

    queryset类型的数据来调用,返回数据库中匹配查询(QuerySet)的对象数量。

    ret = models.UserInfo.objects.all().count()
    

    first()

    queryset类型的数据来调用,返回第一条记录

    Book.objects.all()[0] = Book.objects.all().first()
    

    得到的都是model对象,不是queryset

    last()

    queryset类型的数据来调用,返回最后一条记录,使用方法与first相同。

    exists()

    queryset类型的数据来调用,如果QuerySet包含数据,就返回True,否则返回False

    空的queryset类型数据也有布尔值True和False,但是一般不用它来判断数据库里面是不是有数据,如果有大量的数据,你用它来判断,那么就需要查询出所有的数据,效率太差了,用count或者exits,比如:

    all_books = models.Book.objects.all().exists()
    

    翻译成的sql是:

    SELECT (1) AS a FROM app01_book LIMIT 1
    

    就是通过limit 1,取一条来看看是不是有数据,效率就高了很多。

    values(*field)

    用的比较多。queryset类型的数据来调用,返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列。只要是返回的queryset类型,就可以继续链式调用queryset类型的其他的查找方法,其他方法也是一样的。

    queryset调用:

    ret = models.UserInfo.objects.all().values('age','username')
    

    objects调用--对所有数据进行取值:

    ret = models.UserInfo.objects.values('age','username')
    

    values_list(*field)

    它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列

    distinct()

    values和values_list得到的queryset类型的数据来调用,从返回结果中剔除重复纪录

    ret = models.UserInfo.objects.all().values('age','username').distinct()
    ret = models.UserInfo.objects.values('age','username').distinct()
    

    MRO创建时间的格式

    创建时,日期字段数据的添加方式

            models.Book.objects.create(
                # publish_date = "2019-08-01",  字符串
                # publish_date = datetime.datetime.now(), 时间日期数据
            )
    
    

    update和delete

    update更新数据时,只能使用queryset类型数据:

    models.Book.objects.filter(id=2).update(username='xxx')  #update的调用者是queryset类型数据
    

    delete删除数据时,可以使用queryset类型数据,也可以直接使用数据对象:

    models.Book.objects.filter(id=2).delete()
    models.Book.objects.get(id=2).delete()
    

    练习

    1. 查询某某出版社出版过的价格大于200的书籍
    2. 查询2017年8月出版的所有以py开头的书籍名称
    3. 查询价格为50,100或者150的所有书籍名称及其出版社名称
    4. 查询价格在100到200之间的所有书籍名称及其价格
    5. 查询所有人民出版社出版的书籍的价格(从高到低排序,去重)
  • 相关阅读:
    c/c++生成预编译文件
    (转)vim 访问系统剪贴板
    vim 使用、设置笔记
    使用cygwin注意事项二
    (转)使用cygwin注意事项一
    cygwin Could not create directory '/home/Administrator/.ssh'
    Linux 学习笔记 文件权限
    Linux 学习笔记 Linux环境变量初稿
    Linux 学习笔记 更多的bash shell命令
    Linux 学习笔记 查看文件内容诸多命令
  • 原文地址:https://www.cnblogs.com/shuoliuchina/p/11908140.html
Copyright © 2011-2022 走看看