1 Django如何在Model保存前作必定的固定操做,好比寫一條日誌
(1)利用Django的Model的Signal Dispatcher, 經過django.db.models.signals.pre_save()方法,在事件發生前,發射觸發信號,django
(1) 信號.connect(執行的函數) import logging from django.db import models from django.db.models.signals import pre_save from django.dispatch import receiver class User(models.Model): # ... # logging模塊 logger = logging.getLogger(__name__) fh = logging.FileHandler('model_save.log') formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') fh.setFormatter(formatter) logger.addHandler(fh) (2) receiver裝飾器 @receiver(pre_save, sender=Order) def Log(sender, **kwargs): logger.debug("{},{}".format(sender, **kwargs))
2 Django的 Q 查詢:**
進行相對複雜的查詢時,使用django.db.models.Q對象函數
from django.db.models import Q from login.models import Order #... Order.objects.get( Q(id >= 20) & (id <= 100), Q(num <= 20) | (num >= 30) )
3 自定義管理器 (默認是objects)**
Django的Queryset是 查詢的數據記錄,objects 默認Manager管理器spa
須要繼承Manager 類 定義 管理器: class AuthorManager(models.Manager): def get_queryset(self): return super(AuthorManager, self).get_queryset().filter(age__gt=3) class BookManager(models.Manager): def get_queryset(self): return super(EditorManager, self).get_queryset().filter(age_lt=2) 使用 管理器: class People(models.Model): name = models.CharField(max_length=50) pwd = models.CharField(max_length=50) age = models.IntegerField() objects = Manager() #默認的管理器 注意 : 自定義其餘管理器後,不加上這個默認的,管理器會被自定義的覆蓋掉(不能使用) people = models.Manager() authors = AuthorManager() editors = EditorManager() # 本身定義的管理器 這時候有多個管理器 使用 : People.authors.all()
4 Django中 model的繼承**
1 繼承 抽象類 (在 父類中指定 class meta: abstract = True)debug
a 子類中 包含了父類中的字段, b 可是做爲父類的抽象類,因爲沒有manager,不能建立、保存。 c 而 在子類中,不能夠創建與這個抽象父類中的相同的字段,不然Django表示對報錯 實例: class Animal(models.Model): age = models.PositiveIntegerField() # 下面這句決定了Animal是一個抽象類/Model class Meta: abstract = True class Human(Animal): name = models.CharField(max_length=64) sex = models.CharField('sex', choices=(('m', 'male'), ('f', 'female')), max_length=1)
2 普通繼承類 ()代理
a 父類子類 都會建立數據表,子類能夠操做父類的字段,並會在兩張表中都生成數據 b 一樣 子類不能與父類的字段重複 實例: class Animal(models.Model): age = models.PositiveIntegerField() class Human(Animal): hid = models.IntegerField(primary_key=True) name = models.CharField(max_length=64) sex = models.CharField('sex', choices=(('m', 'male'), ('f', 'female')), max_length=1)
3 代理繼承類 (在 子類中指定 class meta: proxy = True)日誌
a 只建立父類 ,不會建立新的數據表 b 子類中只能增長方法,而不能增長屬性,在不影響父類數據存儲的前提下 Proxy model 'Human' contains model fields. 使子類繼承父類,此時子類稱爲父類的「代理」,不影響 父類的數據 實例: class Animal(models.Model): age = models.PositiveIntegerField() name = models.CharField(max_length=64,null=True,blank=True,default='') sex = models.CharField('sex', choices=(('m', 'male'), ('f', 'female')), max_length=1) class Human(Animal): # hobby = models.CharField(max_length=64,default='') class Meta: proxy = True def get_num(self): return 123 # 能夠添加動態字段屬性