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. 查询所有人民出版社出版的书籍的价格(从高到低排序,去重)
原文地址:https://www.cnblogs.com/shuoliuchina/p/11908140.html