Django的静态文件在settings.py
中的配置一般是这样的:
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'statics'), #文件夹名称尽量不要和别名的名称冲突
]
静态文件的另外一种引入方式
{% load static %}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<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别名反向解析时如果需要参数,HTML代码中可以在别名后直接加上参数:
{% url '别名' 3 %}
实际上在模板渲染时,路径被渲染为/index/3/
的形式。所以,在路由分发时,我们可以使用正则传参的方式,把参数传递给视图函数:
url(r'^index/(\d+)/',views.index,name='index');
如果在views视图反向解析时需要传入参数,我们只需增加arg参数即可:
reverse('index',args=(3,)) # /index/3/
all()
查询所有结果,结果是queryset类型
filter(**kwargs)
它包含了与所给筛选条件相匹配的对象,结果也是queryset类型:
Book.objects.filter(title='linux',price=100)
里面的多个条件用逗号分开,并且这几个条件必须都成立,是and的关系,or关系的我们后面再学,直接在这里写是搞不定or的。
除了直接使用objects对象外,还可以使用queryest使用filter方法:
ret = models.UserInfo.objects.all().filter()
返回与所给筛选条件相匹配的对象,不是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()
创建时,日期字段数据的添加方式
models.Book.objects.create(
# publish_date = "2019-08-01", 字符串
# publish_date = datetime.datetime.now(), 时间日期数据
)
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()