次のようなモデルがあります:
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.