对于扩展信息,我应该使用Django的多表继承还是显式的OneToOneField

时间:2011-09-23 15:07:30

标签: django database-design django-models

我在模型上有一些字段并不总是被填写(例如,直到项目结束时的实际完成日期和成本)。因此,我认为我将模型分成两部分:

  1. 模型#1 :包含经常搜索且始终完成的字段的密集表
  2. 模型#2 :包含不经常搜索且不总是已完成字段的稀疏表
  3. 问题

    1. 我是否正确地将其分成两个模型/表?
    2. 我应该使用Django的多表继承,还是应该明确定义OneToOneField?为什么?
    3. 配置

      • Django版本1.3.1

      模型

      使用Django的多表继承

      class Project(models.Model):
          project_number = models.SlugField(max_length=5, blank=False,
                  primary_key=True)
          budgeted_costs = models.DecimalField(max_digits=10, decimal_places=2)
      
      class ProjectExtendedInformation(Project):
          submitted_on = models.DateField(auto_now_add=True)
          actual_completion_date = models.DateField(blank=True, null=True)
          actual_project_costs = models.DecimalField(max_digits=10, decimal_places=2,
                  blank=True, null=True)
      

      使用显式OneToOneField

      class Project(models.Model):
          project_number = models.SlugField(max_length=5, blank=False,
                  primary_key=True)
          budgeted_costs = models.DecimalField(max_digits=10, decimal_places=2)
      
      class ProjectExtendedInformation(models.Model):
          project = models.OneToOneField(CapExProject, primary_key=True)
          submitted_on = models.DateField(auto_now_add=True)
          actual_completion_date = models.DateField(blank=True, null=True)
          actual_project_costs = models.DecimalField(max_digits=10, decimal_places=2,
                  blank=True, null=True)
      

1 个答案:

答案 0 :(得分:2)

你基本上是在处理苹果和苹果。 Django的MTI实现(多表继承)使用隐式的OneToOneField。