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 = True
def 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()