gpt4 book ai didi

python - Django:您正在尝试添加一个不可为空的字段 'slug' 以在没有默认值的情况下发布;我们不能那样做

转载 作者:行者123 更新时间:2023-12-04 16:38:03 25 4
gpt4 key购买 nike

我正在尝试添加 slug,以便帖子的标题出现在 url 中,但我在控制台上收到此消息:

You are trying to add a non-nullable field 'slug' to post without a default; we can't do that Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py
模型.py
class Post(models.Model):

title = models.CharField(max_length=100)
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
slug = models.SlugField(unique=True)

def save(self, *args, **kwargs):
self.slug = self.slug or slugify(self.title)
super().save(*args, **kwargs)

最佳答案

如果没有 null,Django 无法自行添加新字段此处允许使用值,尤其是当您有 unique=True 时在此字段上设置。要解决该问题,您必须分步执行:

  • 添加一列 null=True或没有 unique=True和一些默认值
  • 确保数据库中的所有记录都具有唯一值。
  • 将字段更改为最终状态。

  • 您可以通过 3 次迁移完成所有这些操作。以下是执行此操作的详细步骤。在继续之前,请确保删除以前尝试解决该问题时创建的所有迁移。您可能必须从能够成功应用它们的环境中撤消这些迁移。
    1.添加一列 null=True或没有 unique=True并有一些默认值
    您可以让 Django 为您创建此迁移。只需将您的字段编辑为如下所示:
        slug = models.SlugField(unique=True, null=True)
    并运行 ./manage.py makemigrations这样做之后。
    2. 确保数据库中的所有记录都具有唯一值。
    这一步必须在某种程度上手工制作。首先通过调用 ./manage.py makemigrations YOUR_APP_NAME --empty 要求 Django 为您创建新的空迁移。 .现在打开这个新的迁移文件并在 Migration 之前添加此代码(根据您的需要进行调整,特别是确保为每条记录生成唯一值)。类(class):
    def populate_posts_slug_field(apps, schema_editor):
    for post in apps.get_model('YOUR_APP_NAME.post'):
    post.slug = # generate a unique value for every post here
    post.save()
    现在,添加一个将在执行此迁移时运行上面定义的代码的操作。为此,将此条目添加到 operationsMigration 中列出您的迁移类别:
    migrations.RunPython(populate_posts_slug_field, migrations.RunPython.noop),
    ( RunPython 的第二个参数是一个特殊的函数,它什么都不做,当你想取消应用这个迁移时它会被执行)。
    3. 将字段更改为最终状态。
    这也可以由 Django 自己处理。将您的字段更改为最终状态(如您的问题)并运行 ./manage.py makemigrations再来一次。
    你都准备好了。运行 ./manage.py migrate现在应该成功了。
    注意:可以在单个迁移文件中运行所有 3 个操作,但应避免这样做。在一次迁移中同时运行数据和模式更改可能会导致某些数据库后端出现问题,因此应该完全避免这种情况。

    关于python - Django:您正在尝试添加一个不可为空的字段 'slug' 以在没有默认值的情况下发布;我们不能那样做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66784564/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com