Django 知识点补充

Django 知识点补充


1 Django如何在Model保存前做一定的固定操作,比如写一条日志


(1)利用Django的Model的Signal Dispatcher, 通过django.db.models.signals.pre_save()方法,在事件发生前,发射触发信号,

	(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管理器

	需要继承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)

	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  # 可以添加动态字段属性
原文地址:https://www.cnblogs.com/big-handsome-guy/p/8671408.html