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 # 能够添加动态字段属性