本节将介绍Django模型的属性和方法,以及如何重写之前定义的模型方法等内容。
Django模型中最重要的属性就是Manager,它是Django模型和数据库查询操作之间的接口,并且是被用来充当从数据库中获取实例的途径。如果Django模型中没有指定自定义的Manager,则默认名称就是objects。
另外,Manager只能通过模型类来访问,不能通过模型实例来访问。
在Django模型中,添加自定义方法会给对象提供自定义的“行级”操作能力,与之对应的是Manager的方法,目的是提供“表级”的操作。模型方法应该在某个对象实例上生效,这是一个将相关逻辑代码放在模型上的技巧。
关于模型方法的使用,请看下面的代码示例:
【代码3-12】
【代码分析】
● 第03行代码中,定义了一个描述人的年龄段的类(PersonAge)。
● 第07~24行代码中,定义了类(PersonAge)的模型方法(person_age_status()),返回具体年龄段的信息。
● 第07~24行代码中,定义了类(PersonAge)的属性方法(person_info()),返回个人信息。
Django模型中还提供了一个模型方法的集合,它包含了一些可能是自定义的数据库行为,比如save()方法和delete()方法就是两个最有可能定制的方法。同时,开发人员可以随意地重写这些方法(或其他模型方法)来修改方法的行为。
例如,有一个非常典型的、重写内置方法的场景,就是打算在保存对象时额外做一些事。请看一个重写save()方法的代码示例。
【代码3-13】
【代码分析】
● 第03行代码中,定义了一个描述博客的类(Blog)。
● 第07~10行代码中,重写了save()方法。
● 第09行代码中,通过super()方法调用了父类中原生的save()方法。
● 在第08行和第10行代码中,开发人员可以通过编写自己的代码,实现重写save()方法的操作。
另外,还可以重写save()方法来实现阻止该方法的执行。请看下面第二个关于重写save()方法的代码示例。
【代码3-14】
【代码分析】
● 第03行代码中,定义了一个描述博客的类Blog。
● 第07~11行代码中,重写了save()方法。
● 第08~11行代码中,通过if…else…条件语句判断name属性值,然后根据判断条件来选择是否通过super()方法调用父类中原生的save()方法。
Django模型会不时地扩展模型内置方法的功能,也会添加新参数。比如,加入开发人员在重写的方法中使用了*args参数和**kwargs参数,确保重写方法能够接受这些新加的参数。