私は値を記録するいくつかのプローブを持っていると言います。私はDjangoモデルを設定して、プローブとそれが記録する測定値を表現したいと思っています。したがって、このような何かが働くだろう:更新されたフィールドの以前の値を自動的に保存するモデル保存メソッドをオーバーライドします
class Probe(models.Model):
name = models.CharField(max_length=256)
def __unicode__(self):
return u'<Probe: %s>' % self.name
class Observation(models.Model):
probe = models.ForeignKey(Probe)
obstime = models.DateTimeField()
# the above field should be understood to represent the time in the world
# represented by the measurement value recorded. *not* the time at which
# that value was written to the database.
value = models.FloatField()
class Meta:
unique_together = (('probe', 'obstime'),)
def __unicode__(self):
tup = (self.probe.name,
self.obstime.strftime('%Y%m%d-%H%M%S'),
'%0.2f' % self.value)
return u'<Observation: %s @ %s = %s>' % tup
しかし、これを超えたが、私は少しより多くの情報を追跡できるようにするには、私のデータベースやアプリを本当にしたいと思います。特に、私は実際にObservation
モデルに3つの追加フィールド、つまり,previous_value
、previous_db_recording_time
を追加したいと考えています。私は、ユーザが上記のエントリだけを直接操作しようとしますが、他のフィールドは予想通りに自動的に動作します。私はObservation
クラスのsave
メソッドをオーバーライドすることでこれを可能にするべきだと思いますが、私はいくつかの助けが必要です!
人が1月5日の正午に自分のコンピュータに戻ってきて、コンピュータに座っているとします。彼らは、ProbeAがJan1stの2AMで3.14を読み取ったことを示すいくつかの(決して前に入力された)データを記録したい。同じ人が見ることができることを、その後、数時間後に(2PMJan5th)
probe: ProbeA,
obstime: 2AMJan1st,
value: 3.14,
db_recording_time: NoonJan5th,
previous_value: Null,
previous_db_reording_time: Null
:私は彼らが3.14と2AMJan1stを指定する必要がするだけしたいと思いますが、私は観察をしてDBに行きたいと思います彼らのノートブックで、 "おっと、私は私のノートブックの価値を誤解...それは本当に2.14だった"を実現する。だから私は(管理者やPythonコンソールを使って)既存の観測を呼び出し、3.14を2.14に修正して欲しいと思います。彼らは私がDB内の観察を示したいと思います、ということでした場合:
probe: ProbeA,
obstime: 2AMJan1st,
value: 2.14,
db_recording_time: 2PMJan5th,
previous_value: 3.14,
previous_db_reording_time: NoonJan5th
私はこのように感じるの管理インターフェイスで読み取り専用フィールドのいくつかの組み合わせだけでなく、いくつかの合理的なビットと非常に簡単でなければなりませんObservation
クラスのsave
メソッドでオーバーライドします。どんな助けでも大歓迎です!あなたが保存する前に、データベースから古いレコードを取得でき
をあなたはそれが参照する観測モデルでself' 'への外部キーを追加する方が理にかなって思います観察は早く行われ、これらのフィールドを複製する必要はありませんか?あるいは、あなたはいつも同じ観察を参照したいですか?その場合、前回の観測値からのみ値が得られます。その前のものではありません。しかし、「自己」への外部キーを使用すると、一連の観測結果を保存し、相互にリンクさせることができます。 – AKS
これは非常にクールなアイデアです。したがって、自己への外部キーは、early_observation_draftのように呼び出されます。意味をなさないしかし、もし私がそうするなら、与えられたプローブの観察時間の範囲に対して最も最近入力された値だけを返すクエリを書く効率的な方法はありますか?私。拡張の前に、Observation.objects.filter(probe = choseprobe)またはObservation.objects.filter(probe = selectedprobe、obstime__gte = start、obstime__lte = end)を実行できます。しかし、強化した後は、「現在考慮されている権利」の値と修正された草案の両方が得られます。 – 8one6
回答として私のコメントを追加し、あなたの他の質問にも答えようとしました。 – AKS