Django中的动态字段计算

时间:2012-03-12 16:23:40

标签: python mysql django

我正在django做一个待办事项列表。我有一个带有一些属性的模型:

class Action(models.Model):
    name = models.CharField("Action Name", max_length=200, unique = True)
    slug = models.SlugField(max_length=100, blank=True)

    complete = models.BooleanField(default=False, verbose_name="Complete?")

    effort = models.IntegerField("Effort Level", choices = LEVELS, default = 3)
    importance = models.IntegerField("Importance", choices = LEVELS, default = 3)
    enjoyment = models.IntegerField("Enjoyment", choices = LEVELS, default = 3)

    days_to_expiration = models.IntegerField("Days to Expiration", choices = DAYS_TO_EXPIRATION, default = 7)

    reset_date = models.DateField("Date of Action Reset", blank=True, null=True)

我想根据优先级排序。我将优先级定义为:

priority = (1 + (today's date - reset_date) / days_to_expiration) * importance

这只会根据任务“过期”的程度来扩大重要性。

现在当我拉出一个未完成的动作列表时,我可以计算每个动作项目的优先级数,但这似乎没有效率,因为我最终会多次计算相同的数字。我可以在模型中定义一个新字段:

priority = models.DecimalField("Priority", max_digits=4, decimal_places=2, blank = True, null = True)

并安排一个函数每天运行一次以计算每个任务的新优先级。

但我想知道是否可以将优先级计算直接编程到模型中。因此,Action模型中的优先级字段必然是设计为重要性和days_to_expiration的函数。它将使用重要性值,days_to_expiration和今天的日期动态更新。这样,优先级总是在我需要时自动计算。这有可能吗?

2 个答案:

答案 0 :(得分:2)

你想要的是denormalization; priority是非规范化字段。您可以使用信号或扩展save方法,或者以某种巧妙的方式使用管理器方法来实现此目的,但是一个不错的选择是使用django-denorm。该教程经历了与您非常相似的情况。

答案 1 :(得分:1)

您可以执行以下操作:

class MyModel(models.Model):
    ...
    @property
    def priority(self):
        return (1 + (date.today() - self.reset_date) / self.days_to_expiration) * self.importance

然后,您可以像模型上的任何其他属性一样访问它

priority = my_model.priority
相关问题