TODO:表级和行级,增加表级的内容
模型层管理器

一个模型类由静态数据(模型字段)和动态行为(模型方法)两部分组成

假设在第三方模块中定义了下面这样的一个模型,这个模型用来存储定时任务的基本信息,但是在使用中发现无法满足我们的全部需求,我们希望可以扩展这个模型。

  1. class JobModel(models.Model):
  2. job_name = models.CharField(
  3. verbose_name = '任务的名称',
  4. max_length = 32,
  5. )
  6. next_run_time = models.DateTimeField(
  7. verbose_name = '下次运行的时间',
  8. blank=True,
  9. null=True,
  10. )
  11. class Meta:
  12. ordering = ['next_run_time']

可以使用关联关系来扩展原有模型类的静态数据

  1. class JobExtensionModel(models.Model):
  2. JOB_TYPE_CHOICE = [
  3. ('0', '域名类任务'),
  4. ('1', '主机类任务'),
  5. ('2', '端口类任务'),
  6. ]
  7. job = models.OneToOneField(
  8. verbose_name = '对应的定时任务',
  9. to='JobModel',
  10. related_name = 'extension',
  11. )
  12. job_type = models.CharField(
  13. verbose_name = '定时任务的类型',
  14. max_length = 1,
  15. null = True,
  16. blank = True,
  17. choices = JOB_TYPE_CHOICE,
  18. )
  19. class Meta:
  20. verbose_name = '定时任务Job的扩展信息'
  21. verbose_name_plural = verbose_name

通过JobModel的模型实例获取job_type的值

  1. JobModel.objects.last().extension.get_job_type_display()

使用代理模型来扩展原有模型类的动态行为

代理模型类可以使用原模型类的模型字段、数据、方法,
原模型类无法调用代理模型类的方法

在如下示例中,定义一个JobModel的代理模型类,并增加一个方法

  1. class MyJobModel(JobModel):
  2. class Meta:
  3. proxy = True
  4. def get_status_display(self):
  5. return '启用中' if next_run_time else '停用中'

MyJobModel的模型实例既可以调用JobModel的模型方法,又可以调用get_status_display方法。
JobModel的模型示例无法调用get_status_display方法。

  1. > MyJobModel.objects.last().get_status_display()