【问题标题】:DRF created_by updated_by fail during migrationsDRF created_by updated_by 在迁移期间失败
【发布时间】:2021-11-11 20:14:44
【问题描述】:

我想为我的所有数据库对象添加一个 created_by 和 updated_by 字段。我为此创建了一个通用模型,大多数其他对象都将使用该模型。到目前为止,我已经解决了大多数障碍。但是 make migrations 脚本以错误结束:

我的模特:

class CommonModel(models.Model):
"""Common fields that are shared among all models."""

    created_by = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.PROTECT,
                               editable=False, related_name="+")
    updated_by = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.PROTECT,
                               editable=False, related_name="+")
    created_at = models.DateTimeField(auto_now_add=True,
                                  editable=False)
    updated_at = models.DateTimeField(auto_now=True,
                                  editable=False)
    class Meta:
        abstract = True

class Tag(CommonModel):
"""Tag to be used for device type"""
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name

我得到的错误是:

您正在尝试将不可为空的字段“created_by”添加到没有默认值的设备类型;我们不能这样做(数据库需要一些东西来填充现有的行)。 请选择一个修复:

  1. 现在提供一次性默认值(将在所有现有行上设置此列的空值)
  2. 退出,让我在 models.py 中添加一个默认值

我在互联网上找到的唯一“解决方案”是定义 default='',再次运行 makemigrations,然后手动编辑文件以删除 default=''。 我不敢相信这是正确的方法,而且还没有解决方案。

【问题讨论】:

  • 这不是错误。它只是询问它应该对 现有 记录的created_by 做什么。 default='' 完全没有意义:那是一个字符串,ForeignKey 只接受用户对象,或者用户对象的主键。

标签: django-models django-rest-framework


【解决方案1】:

您需要为created_atupdate_at 设置默认值,因为它们不是null=True

您在迁移期间收到的消息不是错误。如果你想提供一个默认值,选择修复1.,它应该会显示以下提示,

Please enter the default value now, as valid Python
The datetime and ` modules are available, so you can do e.g. timezone.now
Type 'exit' to exit this prompt
>>> 

您可以在此处使用datetimedjango.utils.timezone 模块设置默认值。

【讨论】:

  • 谢谢你和威廉。我没有意识到我在测试应用程序时没有清除数据库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 2016-02-16
  • 2018-08-27
相关资源
最近更新 更多