zoukankan      html  css  js  c++  java
  • 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  # 可以添加动态字段属性
  • 相关阅读:
    python测试开发django-rest-framework-92.反序列化(ModelSerializer)之DecimalField保留2位小数
    python测试开发django-rest-framework-91.反序列化(ModelSerializer)之ChoiceField选项字段校验
    python测试开发django-rest-framework-90.反序列化(ModelSerializer)之唯一字段校验UniqueValidator
    python测试开发django-rest-framework-89.反序列化(ModelSerializer)之read_only和write_only
    python测试开发django-rest-framework-88.反序列化(ModelSerializer)之校验传入参数
    python接口自动化39-JMESPath解析json数据
    sql server全文搜索和filestream
    sql server 2008 filestream
    sql server存储和搜索非结构化数据
    cross server怎么取出自定义头部的Token
  • 原文地址:https://www.cnblogs.com/big-handsome-guy/p/8671408.html
Copyright © 2011-2022 走看看