1. 程式人生 > >Python系統學習-20

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