Django默认模型字段值

时间:2018-01-01 11:04:53

标签: python django django-models

假设我有一个这种类型的Django对象:

class Some(Model):
    some_value = CharField(max_length=20)

过了一会儿(后来有几个对象),我知道我想为每个新对象保存创建的时间,所以我添加了以下字段:

created = FloatField(default=time.time)

现在假设我有一些旧的对象是在没有"创建"的情况下创建的。领域。当我查询它们时,它们会收到默认的time.time,即使它被认为是None。 如何为所有旧对象获取不同的值?我只希望使用此默认值创建新对象,并将没有此字段的所有旧对象称为None或其他某些已知值。设置null = True并没有什么不同。

谢谢!

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,您希望现在添加created字段默认但希望将其设置为None旧行。您可以通过进行两次迁移来实现此目的:

  • 添加新字段并将其默认为None

    created = FloatField(null=True, default=None)
    
  • 运行makemigrations

  • 更改较新字段的默认值:

    created = FloatField(null=True, default=time.time)
    
  • 运行makemigrations

  • 运行migrate

首次迁移时,所有旧行created都将设置为None(因为它们没有值,将使用默认值)。当秒迁移运行时,旧行不会更改,因为它们已经有值。新行将使用默认值(time.time)。

没有迁移

如果已在DB中创建表,则

syncdb不执行任何操作。您应该手动修改数据库(即SQL的ALTER TABLE命令)

  • 修改您的数据库并添加一个可以为created的可用NULL字段作为默认值。
  • 在代码中添加字段(使用default=time.time

向DB添加新的可空列时,所有现有行都将设置为NULL,Django将在应用程序级别处理默认值。