博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django 知识点补充
阅读量:4587 次
发布时间:2019-06-09

本文共 3678 字,大约阅读时间需要 12 分钟。

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)

1220788-20180329180346679-496406761.png

1220788-20180329180357493-1706542000.png

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 普通继承类 ()

1220788-20180329180410703-1733559605.png

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

你可能感兴趣的文章
java线程详解(三)
查看>>
9.17模拟赛2.0
查看>>
洛谷 P3225 [HNOI2012]矿场搭建
查看>>
orcad找不到dll
查看>>
各种排序算法的性能特点
查看>>
LET IT BE
查看>>
在线帮助你修改图片背景的工具 - Clipping Magic
查看>>
BizTalk动手实验(十三)EDI解决方案开发配置
查看>>
初学github
查看>>
iOS开发拓展篇—UIDynamic(重力行为+碰撞检测)
查看>>
extjs 下载文件 关键前后端代码
查看>>
.NET 4.0 兼容 .NET 2.0 的方法
查看>>
1001 Maximum Multiple(2018 Multi-University Training Contest 1)
查看>>
对Java对象的认识与理解
查看>>
python——父类与子类的一些说明
查看>>
2019年3月3日 2018-2019-2 20189205《移动平台应用开发实践》第二周作业
查看>>
MySQL 性能优化--优化数据库结构之优化数据类型
查看>>
软件工程之软件需求分析
查看>>
Electron简介和安装使用
查看>>
Improving Visual C++ Debugging with Better Data Display
查看>>