- 多对多操作
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.IntegerField()
sale = models.IntegerField()
kucun = models.IntegerField()
def __str__(self):
return "<Book:{}- {}>".format(self.id, self.title)
class Author(models.Model):
name = models.CharField(max_length=32)
books = models.ManyToManyField(to='Book')
books = models.ManyToManyField(to='Book') # Django自动生成第三张表
1. 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() ——》 创建一个新的书籍对象 并且和当前的作者对象做关联
2. ORM操作进阶
1. 聚合和分组
聚合
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的内容只能是前面提到的
2. F和Q
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
3. 事务
一系列的操作,要么都成功,要么都失败。
from django.db import transaction
try:
with transaction.atomic():
models.Book.objects.update(price=100)
# models.Book.objects.get(id=100)
models.Book.objects.update(price=200)
except Exception as e:
print(e)
4. 模板之自定义filter、simple_tag、inclusion_tag
1. 自定义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 用函数名
2. 自定义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' %}
3. 自定义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%}
5. cookie和session
https://www.cnblogs.com/maple-shaw/articles/9502602.html
1. cookie
1. cookie是保存在浏览器本地的一组组键值对
2. 特性
服务器让浏览器进行设置的
浏览器有权利决定是否设置
下次访问服务器的时候带着cookie
3. Django中操作cookie
设置cookie 本质 Set-Cookie: is_login=1
ret = redirect(reverse('app01:publisher'))
ret.set_cookie('is_login','1')
取cookie
request.COOKIES {}
删除cookie
ret = redirect(reverse('app01:publisher'))
ret.delete_cookie('is_login')
2. session
1. 保存在服务器上的一组组键值对
2. 为什么用session?
1. cookie保存在浏览器上的 不安全
2. cookie的长度受到限制
3. Django中操作session
设置session
request.session[k1]=v1
request.session.setdefault(k1,v1)
获取session
request.session[k1]
request.session.get(k1)
删除session
del request.session[k1]
request.session.delete()
request.session.flush()
4. 配置
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
SESSION_COOKIE_AGE = 1209600