【问题标题】:Persistent Calculated Fields in DjangoDjango中的持久计算字段
【发布时间】:2016-08-12 00:55:37
【问题描述】:

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

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

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

【问题讨论】:

    标签: python django


    【解决方案1】:

    一种方法是使用一个在保存对象时计算的常规模型字段,例如:

    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

    【讨论】:

    • 我显然是个白痴。这是解决问题的好方法。我会稍微修改它并连接到保存信号,因为我需要在插入和删除时重新计算该字段(取决于条目数)。但是是的,这种方法本质上是正确的。
    猜你喜欢
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多