【问题标题】:Django migrationsDjango 迁移
【发布时间】:2015-05-26 14:49:34
【问题描述】:

我正在尝试在 django 上建立一个博客。我已经走到了创建模型的地步。他们在这里:

from django.db import models

import uuid

class Users(models.Model):
    username = models.CharField(max_length = 32, primary_key = True)
    password = models.CharField(max_length = 32)
    email = models.EmailField()
    registration_date = models.DateTimeField(auto_now_add = True)

class Posts(models.Model):
    author = models.ForeignKey("Users")
    header = models.CharField(max_length=100)
    body = models.TextField()
    pub_date = models.DateTimeField(auto_now_add = True)
    mod_date = models.DateTimeField(auto_now = True)
    upvotes = models.PositiveIntegerField()
    views = models.PositiveIntegerField()
    post_id = models.AutoField(primary_key = True)

class Answers(models.Model):
    body = models.TextField()
    author = models.ForeignKey("Users")
    pub_date = models.DateTimeField(auto_now_add = True)
    mod_date = models.DateTimeField(auto_now = True)
    post = models.ForeignKey("Posts")
    answer_id = models.UUIDField(primary_key = True, default=uuid.uuid4)

运行python manage.py migrate 后,我得到以下信息:

您正在尝试将不可为空的字段“post_id”添加到没有 默认;我们不能那样做(数据库需要方法来填充现有的 行)。 请选择一个修复:
1) 现在提供一次性默认值(将在所有现有行上设置)
2)退出,让我在models.py中添加一个默认值

即使我按 1 并尝试设置一个随机的一次性值,它也会成功迁移,但后来网站崩溃并显示“没有这样的表:blog_posts”。但我认为它应该没有像手动设置默认值这样的变通方法。

我尝试使用帖子和答案的主键。我尝试完全删除它们,以便 django 自动设置它们并尝试将其从 AutoField 更改为 UUIDField ,反之亦然,但它没有帮助。我做错了什么?

【问题讨论】:

  • 在那之前你有迁移过吗?您的数据库中有数据吗?
  • 是的,我确实进行了一些迁移。虽然数据库中没有数据。删除迁移似乎有所帮助

标签: python django django-migrations


【解决方案1】:

您看到此错误消息是因为 django 正在尝试构建一致的迁移历史记录,并且它抱怨如果有一个数据库保存了您的旧迁移数据,并且您尝试添加一个不可为空的字段,它不知道该怎么做。

迁移应该被放入版本控制中,并在不同的开发/生产环境中使用。如果您添加一个不能为空的字段,其他环境的现有数据(例如,一个生产数据库,其中包含没有字段 post_id 的模型),那么 django 会警告您这一点,并显示您收到的错误消息,并提供两种解决方案:

  1. 此字段应始终预先填充默认值(您必须修改 models.py)

  2. 这是一次性迁移,您提供一次性值,例如“LEGACY”来标记迁移前数据。

如果您不在生产中并且您的开发服务器上没有有价值的数据,修复此错误消息的简单方法是删除现有的迁移文件并再次运行python manage.py makemigrations && python manage.py migrate

【讨论】:

  • 谢谢!感觉它已经解决了问题,但我不明白为什么会这样。 django 不应该能够应用我对模型所做的所有更改吗?
  • 它抱怨您没有提供说明如何处理假设存在的数据库中的数据。在生产中这很重要,但是在开发中它是一个烦恼。如果它解决了问题,请接受答案。
  • 是的,我知道了,但那是什么数据?我应该提供什么说明?
  • @webdive 即使你的表是空的,django 也想知道它应该如何处理它找到的任何行——代码需要不知道你的数据库的内容。 “我应该提供什么指示”......取决于目标和您的偏好。这确实适用于您拥有现有数据的生产情况......您将如何处理它? Django 无法为你建立关系。假设,我可能允许 FK 为空 (null=True, blank=True),然后编写并运行脚本来修改所有数据并创建 FK 引用。
  • 另见:docs.djangoproject.com/en/1.8/topics/migrations/… ...模式迁移和数据迁移之间的区别有助于理解
猜你喜欢
  • 2018-11-27
  • 2014-12-13
  • 2011-04-03
  • 2018-01-09
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多