Django 知识点补充

Django 知识点补充


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  # 能够添加动态字段属性
相关文章
相关标签/搜索