Python系統學習-20
阿新 • • 發佈:2019-01-11
- 多對多操作
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