Python系统学习-20

  1. 多对多操作
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')  # Django自动生成第三张表
	 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 

猜你喜欢

转载自blog.csdn.net/weixin_41765871/article/details/83314634
今日推荐