Python Django迁移

Python Django迁移,python,django,django-migrations,Python,Django,Django Migrations,我想在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()

我想在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,反之亦然,但没有帮助。我做错了什么?

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

迁移应该放在版本控制中,并在不同的开发/生产环境中使用。如果您添加了一个不能为null的字段,其他环境的现有数据,例如包含没有字段post_id的模型的生产数据库,django将向您发出警告,并提供两种解决方案:

此字段应始终预先设置一个默认值,您必须修改models.py

这是一次迁移,您可以提供一个一次性值,例如LEGACY来标记迁移前数据


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

在此之前您有过迁移吗?你的数据库中有数据吗?是的,我有一些迁移。但数据库中没有数据。删除迁移似乎对Hanks有帮助!感觉它解决了问题,但我不明白为什么会发生。django难道不能应用我对模型所做的所有更改吗?它抱怨说,您没有提供如何处理数据库中假设存在的数据的说明。在生产中这是很重要的,但是在开发中这是一个麻烦。如果它解决了问题,请接受答案。是的,我知道了,但那是什么数据?我应该提供什么指令?@webdive即使您的表是空的,django想知道它应该如何处理在那里找到的任何行-代码需要不知道数据库的内容。我应该提供什么说明。。。取决于目标和您的偏好。这确实适用于您拥有现有数据的生产情况。。。你会用它做什么?Django无法为你建立关系。假设,我可能会允许FK为null null=True,blank=True,然后编写并运行一个脚本来修改所有数据并创建FK引用。另请参见:。。。模式迁移和数据迁移之间的区别有助于理解