2016-08-12 74 views
3

在MS SQL Server中,有一项功能用于创建计算列:在检索时即时计算的表列。这或多或少映射到使用Django模型上的方法来检索计算值(常见示例是基于存储的Forename/Surname字段检索全名)。Django中的持久计算字段

对于昂贵的操作,SQL Server提供了一个Persisted选项。这使用计算结果填充表列,并在更新表时更新这些结果 - 当计算速度不快但不比访问更频繁时,这是非常有用的功能。

但是,在Django中,我无法找到重复此功能的方法。我错过了明显的东西吗?我最好的猜测是某种自定义字段将一个函数作为参数,但是我看不到其中的一个。有没有更好的办法?

回答

3

一种方法就是使用当一个对象被保存的计算规则的模型字段,例如,:

class MyModel(models.Model): 
    first_name = models.CharField(max_length=255) 
    surname = models.CharField(max_length=255) 

    # This is your 'persisted' field 
    full_name = models.CharField(max_length=255, blank=True) 

    def save(self, *args, **kwargs): 
     # set the full name whenever the object is saved 
     self.full_name = '{} {}'.format(self.first_name, self.surname) 
     super(MyModel, self).save(*args, **kwargs) 

你可以从任何型号的形式使这个特殊的领域read-only在管理和类似exclude it

+0

我显然是个白痴。这是解决问题的好方法。我会稍微修改它,然后挂钩保存信号,因为我需要在插入和删除时重新计算字段(取决于条目数量)。但是,这种方法本质上是正确的。 – James