AbstractClass ForeignKey对AbstractClass

时间:2016-11-05 13:51:07

标签: django abstract-class

我正在建立合规管理系统,我对项目中的大多数模型有以下要求:

我的要求

  • 具有特定角色的用户可以更改字段,但这必须导致具有草稿状态的新“版本”
  • 在通过某些其他角色(即经理)批准后,必须发布此版本的模型
  • 所有角色都必须可以访问历史记录

现状

因为可用的django-apps不符合我创建的以下构造的所有这些要求:

  1. 每个模型(例如政策)都有一个和一个明细模型。
  2. Master 模型包含以下字段:
    • ID
    • 删除
    • currentActiveDetail(ForeignKey)
  3. 明细模型包含以下字段:
    • ID
    • majorVersion
    • minorVersion
    • 作者
    • masterModel(ForeignKey to Master
    • user(ForeignKey to auth.User
    • lifecycleStatus(选择,即'草稿','等待批准','已批准','已过时')
    • 许多内容字段(例如说明,文字,...)
    • 很多方法
  4. 挑战/问题

    因为我有很多这样的用例,我想制作一个MasterAbstractClass和一个DetailAbstractClass,但我找不到以下挑战的解决方案:

    1. 如何“保留”抽象类中的ForeignKey字段(我知道我无法定义它们,因为数据库中没有表)。我想如果使用contenttype框架但似乎不够,因为
    2. 另一方面,它是一个AbstractClass( Master )与另一个AbstractClass(详细信息)的引用
    3. 对于用户外键我完全知道我想要引用的模型
    4. 编辑1:刚认识到第3次挑战完全没问题,以下工作:

      class ContentLifecycleDetailClassModel (models.Model):
          author = models.ForeignKey('auth.User', null=True)
      
      
      class Test(ContentLifecycleDetailClassModel):
          pass
      

      CLI

      from polls.models import Test
      from django.contrib.auth.models import User
      test = Test()
      user = User.objects.first()
      test.author=user
      test.save()
      x = Test.objects.first()
      print x.author.username # <-- Working
      

      编辑2: 这个问题已在2009年讨论过,但只有一个抽象类的解决方案用于一个不符合这些需求的实现中:http://djangotricks.blogspot.co.at/2009/02/abstract-models-and-dynamicly-assigned.html

      编辑3: 我最终使用ContentType Framework来解决(1)和(2)

      masterModel_type = models.ForeignKey(ContentType, blank=True, null=True)
          masterModel_id = models.PositiveIntegerField(blank=True, null=True)
          master_Model = GenericForeignKey('masterModel_type', 'masterModel_id')
      

1 个答案:

答案 0 :(得分:0)

通过三次编辑中提到的步骤解决了这些挑战。这不是我期望的清洁解决方案,但它正在发挥作用..