django第三天
动态路由,实现统一删除功能
urls
url(r'^host_del/(host|user|group)/(\d+)$',views.host_del,name='del'),
template
<a href="{% url 'app01:del' 'host' obj.id %}" class="btn btn-sm btn-danger">删除</a>
views
from app01.models import *
import sys
def host_del(request,*args):
table = getattr(sys.modules[__name__],args[0].capitalize())
host = table.objects.filter(id=args[1])
host.first().user.clear()
host.delete()
return redirect(to='/host_list/')
外键的增改查
class Book(models.Model):
title = models.CharField(max_length=32)
publisher = models.ForeignKey('Publisher',related_name='books')
book_obj.publisher ——》 关联的对象
book_obj.publisher_id
book_obj.publisher.id
book_obj.publisher.name
不指定related_name
pub_obj.book_set ——》管理对象
pub_obj.book_set.all()
指定related_name='books'
pub_obj.books ——》管理对象
pub_obj.books.all()
Book.objects.filter(publisher__name='')
不指定related_name
Publisher.objects.filter(book__title='')
指定related_name='books'
Publisher.objects.filter(books__title='')
指定related_name='books',related_query_name='xxx'
publisher = models.ForeignKey('Publisher',related_name='books',related_query_name='xxx')
Publisher.objects.filter(xxx__title='')
多对多的操作
正向查询
author字段里有books字段:
books = models.ManyToManyField(to='Book') # Django自动生成第三张表
author_obj = models.Author.objects.filter(id__lt=3).first()
author_obj.books ——》 管理对象
author_obj.books.all() ——》 所有关联的对象
author_obj.books.set([1,2]) ——》 设置多对多关系
author_obj.books.set([对象1,对象2]) ——》 设置多对多关系
author_obj.books.remove(对象1 或者 id ) ——》 删除某一个多对多关系
author_obj.books.clear() ——》 删除所有多对多关系
author_obj.books.add(对象1 或者 id ) ——》 删除某一个多对多关系
author_obj.books.create() ——》 创建一个新的书籍对象 并且和当前的作者对象做关联
反向查询
跟外键一样。
聚合和分组
聚合
from django.db.models import Sum,Max,Min,Avg,Count
models.Book.objects.aggregate(Sum('price'),Count('price'),max=Max('price'))
分组
models.Book.objects.annotate(Count('author')).values() ——》 对象列表 把聚合结果放到对象中
models.Book.objects.values('publisher__name').annotate(min=Min('price')).values('publisher__name', 'min') ——》最后的values的内容只能是前面提到的
F和Q
from django.db.models import F
F 动态取某个字段的值
ret = models.Book.objects.filter(kucun__lt=F('sale')).values()
models.Book.objects.update(sale=F('sale')*2)
Q 条件
Q(条件)
Q(条件) | Q(条件) 或的关系 or
Q(条件) & Q(条件) 与的关系 and
~Q(条件) 非的关系 not
事务
import os
if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
import django
django.setup()
import datetime
from app01 import models
try:
from django.db import transaction
with transaction.atomic():
new_publisher = models.Publisher.objects.create(name="火星出版社")
models.Book.objects.create(title="橘子物语", publish_date=datetime.date.today(), publisher_id=10) # 指定一个不存在的出版社id
except Exception as e:
print(str(e))
模板之自定义filter、simple_tag、inclusion_tag
-
自定义filter
1. 在app下创建一个名为templatetags的python包
2. 在templatetags下创建python文件 名字可随意 my_tags
3. 导入并实例化
from django import template
register = template.Library() # register名字不能改 4. 定义函数
@register.filter(name='dsb')
def add_dsb(value,arg): # value 变量 arg 冒号后面的参数
ret = "{}_{}".format(value,arg)
return ret 5. 使用:
在模板中使用
{% load my_tags %}
{{ "alex"|dsb:'very_dsb' }} 指定name 用name 没有指定name 用函数名 -
自定义simple_tag
同自定义filter的1、2、3
4.定义函数 @register.simple_tag()
def string_join(*args,**kwargs):
ret = '_'.join(args) + '*'.join(kwargs.values())
return ret
5. 使用
在模板中使用
{% load my_tags %}
{% string_join 'suibian' 'zhensuibian' k1='taisuibian' k2='jiushisuibian' %} -
自定义inclusion_tag
同自定义filter的1、2、3
4.定义函数
@register.inclusion_tag('pagination.html')
def pagination(total,page):
return {'total':range(1,total+1),'page':page} 5. 有模板文件
在模板中根据传过来的参数做渲染 ——》 完整的HTML代码段 6. 使用
在模板中使用
{% load my_tags %}
{% pagination 10 5%}
cookie
Cookie的由来
大家都知道HTTP协议是无状态的。
无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直
接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。
一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的。
状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被
保留。会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此Cookie就是在这样
一个场景下诞生。
什么是Cookie
Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访
问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。
Cookie的原理
cookie的工作原理是:由服务器产生内容,浏览器收到响应后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。
Django中操作Cookie
获取Cookie
request.COOKIES['key']
设置Cookie
rep = HttpResponse(...)
rep = render(request, ...)
rep.set_cookie(key,value,...)
参数
- key, 键
- value='', 值
- max_age=None, 超时时间
- expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
- path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
- domain=None, Cookie生效的域名
- secure=False, https传输
- httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
删除Cookie
def logout(request):
rep = redirect("/login/")
rep.delete_cookie("user") # 删除用户浏览器上之前设置的user的cookie值
return rep
session
http不知道每次请求是谁访问,因为这样快,简单快速,
session写操作
request.session["user"]=user
'''
1、生成随机字符串
2、写cookie {"sessionID":"234asd243dv35fd"}
3、django-session表:
session-key session-data
234asd243dv35fd {"user":"alex"}
'''
session读操作
user=request.session.get("user")
'''
1 {"sessionID":"234asd243dv35fd"} # 先把这个值取出来
2 django-session表:
session-key session-data
234asd243dv35fd {"user":"alex"}
3 {"user":"alex"}.get("user")
'''
request.session到底是什么?
注销:
request.session.flush() 删除表中的记录