TODO:表级和行级,增加表级的内容
模型层管理器
一个模型类由静态数据(模型字段)和动态行为(模型方法)两部分组成
假设在第三方模块中定义了下面这样的一个模型,这个模型用来存储定时任务的基本信息,但是在使用中发现无法满足我们的全部需求,我们希望可以扩展这个模型。
class JobModel(models.Model):job_name = models.CharField(verbose_name = '任务的名称',max_length = 32,)next_run_time = models.DateTimeField(verbose_name = '下次运行的时间',blank=True,null=True,)class Meta:ordering = ['next_run_time']
可以使用关联关系来扩展原有模型类的静态数据
class JobExtensionModel(models.Model):JOB_TYPE_CHOICE = [('0', '域名类任务'),('1', '主机类任务'),('2', '端口类任务'),]job = models.OneToOneField(verbose_name = '对应的定时任务',to='JobModel',related_name = 'extension',)job_type = models.CharField(verbose_name = '定时任务的类型',max_length = 1,null = True,blank = True,choices = JOB_TYPE_CHOICE,)class Meta:verbose_name = '定时任务Job的扩展信息'verbose_name_plural = verbose_name
通过JobModel的模型实例获取job_type的值
JobModel.objects.last().extension.get_job_type_display()
使用代理模型来扩展原有模型类的动态行为
代理模型类可以使用原模型类的模型字段、数据、方法,
原模型类无法调用代理模型类的方法
在如下示例中,定义一个JobModel的代理模型类,并增加一个方法
class MyJobModel(JobModel):class Meta:proxy = Truedef get_status_display(self):return '启用中' if next_run_time else '停用中'
MyJobModel的模型实例既可以调用JobModel的模型方法,又可以调用get_status_display方法。
JobModel的模型示例无法调用get_status_display方法。
> MyJobModel.objects.last().get_status_display()
