2012-03-12 54 views
0

djangoでToDoリストを作成しています。私はいくつかのプロパティを持つモデルを持っています: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) 

とタスクごとに新しい優先順位を計算するために一日一回実行する機能をスケジュールします。

しかし、優先度の計算をモデルに直接プログラムすることができるかどうかを知りたいと思います。したがって、アクションモデルの優先順位フィールドは、設計によって必然的に重要な機能と日々の息抜きの機能です。これは、重要度、days_to_expiration、およびtodayの日付の値を使用して動的に更新されます。そうすれば、優先度はいつでも自動的に計算されます。これは可能でしょうか?

答えて

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 
+0

これは実際に問題を解決するとは思わない。毎回 '優先度 'を計算しています。 –

+0

それはOPが望んでいるようです: "その方法は、優先度はいつでも私が必要なときに自動的に計算されます。 –

+0

これに言及しましたので、isbadawiのポイントは同じであることがわかります。厳密には必要でない場合、優先順位は複数回計算されます。しかし、これは私が想像していたアイデアでした。 –

2

denormalizationとします。 priorityは非正規化フィールドです。おそらく信号でハックしたり、saveのメソッドを拡張したり、これを実現するために巧妙な方法でマネージャメソッドを使用することもできますが、代わりにdjango-denormを使用することもできます。このチュートリアルでは、あなたと非常によく似た状況を経験します。あなたが何か行うことができ

+0

あなたのモデルに他の属性と同じようにアクセスすることができます。私はdjango-denormが日付の依存関係を作成できるかどうか疑問に思いますか?だから、日付が変わると、プライオリティフィールドも更新されますか? –

+0

@Ed。それがあなたが求めているものなら、毎日更新するように設定することができます。最後にデーモンの例を参照してください –

関連する問題