0

モデルを更新するためのある種のタイムスタンプが必要です。問題は、mysql のタイムスタンプが 1 秒の精度しかないことです。そのため、auto_add_now で DateTime を使用する場合、これでは十分ではありません。

float フィールドを使用して、更新ごとに time.time() に割り当てることを考えました。これは、QuerySet.update() を使用して更新を使用するモデルです。

model MyModel:
  last_update = models.FloatField(default=time.time)

次に、保存する前に last_update を更新します (すべての呼び出しは中央の場所を経由するため、作成時に明示的に行うことができます)。たとえば、次のようになります。

m = MyModel(..,last_update=time.time())

または一括更新を行うとき、

m = MyModel.objects.filter(....).update(last_update_time=time.time())

float と order を保存するこのアプローチに問題はありますか?

明確にするために、私は auto_now=True の DateTimeField オプションを認識しています。問題は、1 秒の解像度である MYSQL の日時フィールドにマップされているため、1 秒の解像度が得られることです (私は MYSQL 5.5 を使用しています)。

4

2 に答える 2

3

を使用できると思いますDateField.auto_now。オブジェクトが保存されるたびにフィールドが更新されます。たとえばlast_update = models.DateTimeField(auto_now = True)

Field オプションは、必要なものを正確にアーカイブすることを目的としていることがわかります。

また、そこにあるsaveようにメソッドをオーバーライドし、必要に応じてフィールドを更新することもできます。last_update

個人的には、シンプルさから最初のアプローチをお勧めします。シグナルを使用する 3 番目のオプションもありますが、非常に混乱する可能性があると思います。

于 2013-01-29T14:15:53.787 に答える
1
 from datetime import datetime

 class Model(models.Model):
    date_created = models.DateTimeField()
    date_modified = models.DateTimeField()

 def save(self):
    if self.date_created == None:
       self.date_created = datetime.now()
    self.date_modified = datetime.now()
    super(Model, self).save()
于 2013-01-29T14:05:52.207 に答える