auto_now / auto_now_add を一時的に無効にする 質問する

auto_now / auto_now_add を一時的に無効にする 質問する

次のようなモデルがあります:

class FooBar(models.Model):
    createtime = models.DateTimeField(auto_now_add=True)
    lastupdatetime = models.DateTimeField(auto_now=True)

いくつかのモデル インスタンス (データの移行時に使用) の 2 つの日付フィールドを上書きしたいです。現在の解決策は次のようになります。

for field in new_entry._meta.local_fields:
    if field.name == "lastupdatetime":
        field.auto_now = False
    elif field.name == "createtime":
        field.auto_now_add = False

new_entry.createtime = date
new_entry.lastupdatetime = date
new_entry.save()

for field in new_entry._meta.local_fields:
    if field.name == "lastupdatetime":
        field.auto_now = True
    elif field.name == "createtime":
        field.auto_now_add = True

もっと良い解決策はありますか?

ベストアンサー1

最近、アプリケーションのテスト中にこの状況に直面しました。期限切れのタイムスタンプを「強制」する必要がありました。私の場合は、クエリセットの更新を使用してこのトリックを実行しました。次のようになります。

# my model
class FooBar(models.Model):
    title = models.CharField(max_length=255)
    updated_at = models.DateTimeField(auto_now=True, auto_now_add=True)


# my tests
foo = FooBar.objects.get(pk=1)
    
# force a timestamp
lastweek = datetime.datetime.now() - datetime.timedelta(days=7)
FooBar.objects.filter(pk=foo.pk).update(updated_at=lastweek)

# do the testing.

おすすめ記事