2016-08-12 17 views
3

MS SQL Serverには、計算された列を作成する機能があります。検索時にその場で計算される表の列です。この多かれ少なかれ、Djangoモデルのメソッドを使用して計算された値を取得する方法にマッピングされます(一般的な例は、保存されたForename/Surnameフィールドに基づいてフルネームを取得しています)。Djangoで永続的に計算されるフィールド

高価な操作の場合、SQL ServerにはPersistedオプションが用意されています。これにより、テーブルの列に計算結果が入力され、テーブルが更新されたときにそれらの結果が更新されます。計算が高速ではなく、アクセスに比べて頻繁に変更されない場合は非常に便利です。

しかし、私はこの機能を複製する方法を見つけることができません。私は明白な何かを欠いていますか私の最高の推測は、パラメータとして関数を取るカスタムフィールドのいくつかの並べ替えが、私はそれらの既存のものを見ることができませんでした。より良い方法がありますか?

答えて

3

一つのアプローチは、ちょうどあなたが任意のモデルのフォームからexclude itを管理者に、この特別なフィールドread-onlyを行い、同様でしたオブジェクトが保存されるたびに計算され、通常のモデルフィールド、例えば,:

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) 

を使用することです。

+0

私は明らかに馬鹿です。これは問題を解決する素晴らしい方法です。私はそれを少し修正して、セーブ信号にフックします。私はフィールドを挿入と削除で再計算する必要があります(エントリの数に依存します)。しかし、はい、このアプローチは本質的に正しいです。 – James

関連する問題