【问题标题】:django model reduce duplicate codedjango模型减少重复代码
【发布时间】:2016-01-12 02:20:24
【问题描述】:

这是我的 django 模型
因为我有ProjectsArchiveStatusArchive 用于保存历史数据
您可以看到许多字段是重复的
我想知道如何减少重复代码使代码简单

class Projects(models.Model):
    title      = models.CharField(max_length=255, blank=True)
    link       = models.CharField(max_length=300, blank=True)
    state      = models.CharField(max_length=30, blank=True)
    update_at  = models.DateTimeField(auto_now=True, blank=True, null=True)
    ....

class ProjectsArchive(models.Model):
    title      = models.CharField(max_length=255, blank=True)
    link       = models.CharField(max_length=300, blank=True)
    state      = models.CharField(max_length=30, blank=True)
    update_at  = models.DateTimeField(auto_now=True, blank=True, null=True) 
    ....

class Status(models.Model):
    project             = models.ForeignKey(Projects, null = True, blank = True)
    state               = models.CharField(max_length=255, blank=True)
    crawl_update_at     = models.DateTimeField(auto_now=True, blank=True, null=True)    
    ....
class StatusArchive(models.Model):
    project             = models.ForeignKey(ProjectsArchive, null = True, blank = True)
    state               = models.CharField(max_length=255, blank=True)
    crawl_update_at     = models.DateTimeField(auto_now=True, blank=True, null=True)  
    ....

【问题讨论】:

    标签: python django


    【解决方案1】:

    您可以创建一个 CommonModel,您可以在其中放置冗余字段,然后您想在其中使用它们的任何模型都继承 CommonModel 而不是 models.Model。

    class CommonModel(models.Model):
        class Meta:
            abstract = True
    
        title      = models.CharField(max_length=255, blank=True)
        link       = models.CharField(max_length=300, blank=True)
        state      = models.CharField(max_length=30, blank=True)
        update_at  = models.DateTimeField(auto_now=True, blank=True, null=True)
    
    class ProjectArchive(CommonModel):
          any_new_field_you_want_to_add
    

    【讨论】:

      【解决方案2】:

      您可以参考这里:Abstract base classes

      根据你的问题,我会这样做:

      class BasicInfo(models.Model):
          title      = models.CharField(max_length=255, blank=True)
          link       = models.CharField(max_length=300, blank=True)
          state      = models.CharField(max_length=30, blank=True)
          update_at  = models.DateTimeField(auto_now=True, blank=True, null=True) 
      
          class Meta:
              abstract = True
      
      class Projects(BasicInfo):
          ....
      
      class ProjectsArchive(BasicInfo):
          ....
      

      完成BasicInfo后,您可以重复使用titlelinkstateupdate_at

      但是我们可以为StatusStatusArchive 创建包含statecrawl_update_at 的通用模型。

      class StatusInfo(models.Model):
          state               = models.CharField(max_length=255, blank=True)
          crawl_update_at     = models.DateTimeField(auto_now=True, blank=True, null=True) 
      
          class Meta:
              abstract = True
      
      class Status(StatusInfo):
          project             = models.ForeignKey(Projects, null = True, blank = True)
          ....
      
      class StatusArchive(StatusInfo):
          project             = models.ForeignKey(ProjectsArchive, null = True, blank = True)
          ...
      

      【讨论】:

        【解决方案3】:

        您正在寻找的是抽象元类。

        https://docs.djangoproject.com/en/1.8/topics/db/models/

        class ProjectTemplate(models.Model):
            title      = models.CharField(max_length=255, blank=True)
            link       = models.CharField(max_length=300, blank=True)
            state      = models.CharField(max_length=30, blank=True)
            update_at  = models.DateTimeField(auto_now=True, blank=True, null=True)
            ....
        
            class Meta:
                abstract = True
        
        class Projects(ProjectTemplate):
            pass
        
        
        class ProjectsArchive(ProjectTemplate):
            pass
        

        【讨论】:

          【解决方案4】:

          你可以使用继承。 请看以下链接

          django abstract models versus regular inheritance

          还有关于模型的 django 文档(看看抽象基类)

          https://docs.djangoproject.com/en/1.8/topics/db/models/

          【讨论】:

          • 继承需要链接两个模型(即包含两个表上的数据)我不认为这是意图。
          • 抽象基类在您想将一些通用信息放入许多其他模型时很有用。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-30
          • 2016-07-24
          • 1970-01-01
          相关资源
          最近更新 更多