在Django模型中使用类

时间:2013-11-18 22:58:29

标签: python django

我有一个模型,其中包含大量子字段,看起来应该是按顺序生成的:

class evaluation(models.Model):
    factor1high = models.IntegerField(verbose_name="Factor 1 High Estimate")
    factor1med = models.IntegerField(verbose_name="Factor 1 Mid. Estimate")
    factor1low = models.IntegerField(verbose_name="Factor 1 Low Estimate")
    factor1comment = models.TextField()
    factor2high = models.IntegerField(verbose_name="Factor 2 High Estimate")
    ...
    factor15mid = models.IntegerField(verbose_name="Factor 15 Mid. Estimate")
    factor15low = models.IntegerField(verbose_name="Factor 15 Low Estimate")
    factor15comment = models.textField()

我想做的是将其分为两类,类似于:

classs factor(models.Model):
    high = models.IntegerField(verbose_name="High Estimate")
    med  = models.IntegerField(verbose_name="Mid. Estimate")
    low  = models.IntegerField(verbose_name="Low Estimate")
    comment = models.TextField()
    name = models.textField()

class evaluation(models.Model):
    factors = [
        factor(name = "Factor 1"),
        factor(name = "Factor 2"),
        ...
        factor(name = "Factor 15")
    ]

这当然不适用于Django。看起来这些方面的东西应该是可能的。

到目前为止,我已经尝试过了:

  • 使用ForeignKey来关联因素:工作类型,但我必须在factor_set上使用反向查找来获取因子,这是次优的,并且没有简单的方法来预先构造具有其唯一名称的因子。在没有大量自定义处理程序等的表单中也不能很好地呈现。
  • 使用OneToOne连接因素:功能,但打破了所有Django的优秀集成表单构造和管理的东西。没有简单的方法来取消引用所有因素来迭代它们。

我想出的唯一选择就是手工创建所有字段,这会导致大量的重复工作,这似乎与Django的DRY原则背道而驰。我也非常希望将来能够在一个因素中添加其他参数,而无需一次为每个因素添加一个参数。

似乎应该有办法做到这一点,我一直无法找到它。

2 个答案:

答案 0 :(得分:0)

您可以在创建评估时动态创建一定数量的因素:

class Evaluation(models.Model):
   @classmethod
   def create(cls, num_factors):
       evaluation = cls()
       evaluation.save()
       for i in range(1, num_factors + 1):
           factor(name='Factor: {}'.format(i), evaluation=evaluation)

答案 1 :(得分:0)

我提出的这个问题的最佳解决方案是创建一个自定义FactorField,其中包含原始问题中提到的所有信息。这还允许选项关联自定义窗口小部件以便以有意义的方式显示数据。

我发现this webpage有助于创建自定义对象。