Django总结

2023-12-16 09:27:23

1、模式
mvt模式:
首先通过url去views中匹配响应的视图函数,再通过视图函数去model中查找数据
然后model将查出的数据返回给views,views再将数据传给template,
最后template将数据传到指定的url,即可生成想要的页面或者数据

2、GET/POST/body
数据类型是 QueryDict,一个类似于字典的对象,包含 HTTP GET 的所有参数。
有相同的键,就把所有的值放到对应的列表里。
取值格式:对象.方法。
get():返回字符串,如果该键对应有多个值,取出该键的最后一个值。
name = request.GET.get(“name”)
name = request.POST.get(“name”)
body
数据类型是二进制字节流,是原生请求体里的参数内容,在 HTTP 中用于 POST,因为 GET 没有请求体。
path
获取 URL 中的路径部分,数据类型是字符串。
method
获取当前请求的方式,数据类型是字符串,且结果为大写。

3、响应对象:HttpResponse 对象
HttpResponse(): 返回文本,参数为字符串,字符串中写文本内容。如果参数为字符串里含有 html 标签,也可以渲染
return HttpResponse(“菜鸟教程”)
render(): 返回文本,第一个参数为 request,第二个参数为字符串(页面名称),第三个参数为字典(可选参数,向页面传递的参数:键为页面参数名,值为views参数名)。
return render(request,“runoob.html”,{“name”:name})
redirect():重定向,跳转新页面。参数为字符串,字符串中填写页面路径。一般用于 form 表单提交后,跳转到新页面。
return redirect(“/index/”)

4、命名空间/路由别名
路由别名:path(“login1/”, views.login, name=“login”)
当在不同的 app 目录下的urls 中定义相同的路由别名 name 时,可能会导致 URL 反向解析错误。这时候就可以使用命名空间,在主路由文件中:path(“app01/”, include((“app01.urls”, “app01”)))
views.py 中使用名称空间,语法格式如下:
reverse(“app名称:路由别名” ) return redirect(reverse(“app01:login”)
详情见:https://www.runoob.com/django/django-routers.html

5、django管理工具
通过登录http://127.0.0.1:8000/admin/进入
账号注册:python manage.py createsuperuser

6、数据库各种方法
1、添加:
①、book = models.Book(title=“菜鸟教程”,price=300,publish=“菜鸟出版社”,pub_date=“2008-8-8”) book.save()
②、models.Book.objects.create(title=“菜鸟教程”,price=300,publish=“菜鸟出版社”,pub_date=“2008-8-8”)
2、使用 all() 方法来查询所有内容:
models.Book.objects.all()
3、filter() 方法用于查询符合条件的数据:
models.Book.objects.filter(publish=‘菜鸟出版社’, price=300)
4、exclude() 方法用于查询不符合条件的数据:
models.Book.objects.exclude(publish=‘菜鸟出版社’, price=300)
5、get() 方法用于查询符合条件的返回模型类的对象符合条件的对象只能为一个,如果符合筛选条件的对象超过了一个或者没有一个都会抛出错误。
models.Book.objects.get(pk=5)
6、order_by() 方法用于对查询结果进行排序:
books = models.Book.objects.order_by(“price”)# 查询所有,按照价格升序排列
books = models.Book.objects.order_by(“-price”)# 查询所有,按照价格降序排列
7、reverse() 方法用于对查询结果进行反转:
按照价格升序排列:降序再反转 books = models.Book.objects.order_by(“-price”).reverse()
8、count() 方法用于查询数据的数量返回的数据是整数
books = models.Book.objects.count()# 查询所有数据的数量
books = models.Book.objects.filter(price=200).count()# 查询符合条件数据的数量
9、first() 方法返回第一条数据返回的数据是模型类的对象也可以用索引下标 [0]
models.Book.objects.first()# 返回所有数据的第一条数据
last() 方法返回最后一条数据返回的数据是模型类的对象不能用索引下标 [-1],ORM 没有逆序索引
models.Book.objects.last()# 返回所有数据的最后一条数据
10、exists() 方法用于判断查询的结果 QuerySet 列表里是否有数据
books = models.Book.objects.exists()
报错,判断的数据类型只能为QuerySet类型数据,不能为整型
books = models.Book.objects.count().exists()
报错,判断的数据类型只能为QuerySet类型数据,不能为模型类对象
books = models.Book.objects.first().exists()
11、values() 方法用于查询部分字段的数据
#查询所有的id字段和price字段的数据
books = models.Book.objects.values(“pk”,“price”) # 得到的是第一条记录的price字段的数据
values_list() 方法用于查询部分字段的数据
查询所有的price字段和publish字段的数据
books = models.Book.objects.values_list(“price”,“publish”)
12、distinct() 方法用于对数据进行去重。
#查询一共有多少个出版社
books = models.Book.objects.values_list(“publish”).distinct() # 对模型类的对象去重没有意义,因为每个对象都是一个不一样的存在。
books = models.Book.objects.distinct()
13、filter() 方法基于双下划线的模糊查询(exclude 同理)
#查询价格为200或者300的数据
books = models.Book.objects.filter(price__in=[200,300])
__gt 大于号 ,= 号后面为数字。books = models.Book.objects.filter(price__gt=200)
__gte 大于等于,= 号后面为数字。
__lt 小于,=号后面为数字。
__lte 小于等于,= 号后面为数字。
__range 在 … 之间,左闭右闭区间,= 号后面为两个元素的列表。models.Book.objects.filter(price__range=[200,300])
__contains 包含,= 号后面为字符串
__icontains 不区分大小写的包含,= 号后面为字符串。
__startswith 以指定字符开头,= 号后面为字符串。
__endswith 以指定字符结尾,= 号后面为字符串。
__year 是 DateField 数据类型的年份,= 号后面为数字。
__month 是DateField 数据类型的月份,= 号后面为数字。
__day 是DateField 数据类型的天数,= 号后面为数字。

14、删除:删除一个对象时也会删除与它相关联的外键对象
方式一:使用模型类的 对象.delete()。
返回值:元组,第一个元素为受影响的行数。
books=models.Book.objects.filter(pk=8).first().delete()
方式二:使用 QuerySet 类型数据.delete()(推荐)
返回值:元组,第一个元素为受影响的行数。
books=models.Book.objects.filter(pk__in=[1,2]).delete()
15、修改
方式一:模型类的对象.属性 = 更改的属性值
模型类的对象.save()
返回值:编辑的模型类的对象。
books = models.Book.objects.filter(pk=7).first()
books.price = 400
books.save()
方式二:QuerySet 类型数据.update(字段名=更改的数据)(推荐)
返回值:整数,受影响的行数
books = models.Book.objects.filter(pk__in=[7,8]).update(price=888)

7、查询数据:F, Q结合filter进行查询
from django.db.models import Q,F
F:F(“字段名称”)F 动态获取对象字段的值,可以进行运算。
Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取余的操作。
修改操作(update)也可以使用 F() 函数。
Q:Q(条件判断)之前构造的过滤器里的多个条件的关系都是 and,如果需要执行更复杂的查询(例如 or 语句),就可以使用 Q 。
Q 对象可以使用 & | ~ (与 或 非)操作符进行组合。
优先级从高到低:~ & |。
可以混合使用 Q 对象和关键字参数,Q 对象和关键字参数是用"and"拼在一起的(即将逗号看成 and ),但是 Q 对象必须位于所有关键字参数的前面。

8、auth组件
from django.contrib import auth
用在用户登录注册上面,判断用户是否合法,并跳转到登录成功页面或者跳转到失败页面
user_obj = auth.authenticate(username=username, password=password)
判断之后,再将数据进行保持。用login(request, user_obj)
如果在登出界面的话,直接用logout(request)进行登出

9、Cookie 和Session
Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。
在注册成功后,将用户名写入到cookie,将来会在页面右上角展示
response = http.JsonResponse({‘code’: 0, ‘errmsg’: ‘注册成功’})
写入cookie:注册和登录的时候
response.set_cookie(‘username’, user.username, max_age=36002414)
删除cookie:修改密码和登出的时候
response.delete_cookie(‘username’)
获取cookie:request.session.get(“username”)

记住登录:状态保持周期为两周(就是去设置session数据的过期时间)
#set_expiry(None):Django封装好的,默认两周
request.session.set_expiry(None)
#没有记住登录:浏览器会话结束状态保持就销毁
request.session.set_expiry(0)

文章来源:https://blog.csdn.net/leshen_88/article/details/134964333
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。