假设我有一个这种类型的Django对象:
class Some(Model):
some_value = CharField(max_length=20)
过了一会儿(以及之后的一些对象),我明白我想为每个新对象节省创建的时间,所以我添加了以下字段:
created = FloatField(default=time.time)
假设现在我有一些没有"创建"字段的旧对象。当我查询它们时,它们会收到默认的 time.time,即使它应该是 None。 如何为所有旧对象获取不同的值?我只希望使用此默认值创建新对象,并说所有没有此字段的旧对象均为 None,或其他一些已知值。设置 null=True 不会产生任何影响。
谢谢!
如果我正确理解您的问题,您想添加一个默认为现在的created
字段,但希望将其设置为旧行的None
。您可以通过进行两次迁移来实现此目的:
添加新字段并将其默认为
None
created = FloatField(null=True, default=None)
运行
makemigrations
更改较新字段的默认值:
created = FloatField(null=True, default=time.time)
运行
makemigrations
运行
migrate
首次迁移运行时,所有旧行created
都将设置为None
(因为它们没有值,将使用默认值)。当秒迁移运行时,旧行不会更改,因为它们已经具有值。新行将使用默认值 (time.time
)。
无迁移
如果表已在数据库中创建,则syncdb
不执行任何操作。您应该手动修改数据库(即ALTER TABLE
个 SQL 命令)
- 修改数据库并添加默认值为
NULL
的可为空的created
字段。 - 将字段添加到代码中(带
default=time.time
)
当你向数据库添加新的可为空的列时,所有现有行都将设置为NULL
,并且 Django 在应用程序级别处理默认值。