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  # 能夠添加動態字段屬性
相關文章
相關標籤/搜索