sok*_*ine 9 python django slug
我正在尝试添加 slug,以便帖子的标题出现在网址中,但我在控制台上收到此消息:
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
Run Code Online (Sandbox Code Playgroud)
模型.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)
Run Code Online (Sandbox Code Playgroud)
Gwy*_*idD 13
null
如果此处没有允许值,Django 无法自行添加新字段,尤其是当您unique=True
对此字段进行设置时。要解决该问题,您必须分步骤执行:
null=True
添加带有或不unique=True
带有默认值的列所有这些操作都可以通过 3 次迁移来完成。以下是执行此操作的详细步骤。在继续之前,请确保删除之前尝试解决该问题时创建的所有迁移。您可能必须从能够成功应用这些迁移的环境中撤消这些迁移。
null=True
或不unique=True
带默认值您可以让 Django 为您创建此迁移。只需将您的字段编辑为如下所示:
slug = models.SlugField(unique=True, null=True)
Run Code Online (Sandbox Code Playgroud)
./manage.py makemigrations
做完之后就跑。
这一步在某种程度上必须是手工制作的。首先要求 Django 通过调用 来为您创建新的空迁移./manage.py makemigrations YOUR_APP_NAME --empty
。现在打开这个新的迁移文件并在类之前添加以下代码(根据您的需要进行调整,特别是确保为每个记录生成唯一的值)Migration
:
def populate_posts_slug_field(apps, schema_editor):
for post in apps.get_model("YOUR_APP_NAME", "post").objects.all():
post.slug = # generate a unique value for every post here
post.save()
Run Code Online (Sandbox Code Playgroud)
现在,添加一个操作,该操作将在执行此迁移时运行上面定义的代码。为此,请将此条目添加到迁移类的operations
列表中:Migration
migrations.RunPython(populate_posts_slug_field, migrations.RunPython.noop),
Run Code Online (Sandbox Code Playgroud)
(第二个参数RunPython
是一个特殊函数,它绝对不执行任何操作,当您想要取消应用此迁移时它将被执行)。
这也可以由 Django 本身来处理。将您的字段更改为最终状态(如您的问题所示)并./manage.py makemigrations
再次运行。
你已经准备好了。./manage.py migrate
现在运行应该会成功。
注意:可以在单个迁移文件中运行所有 3 个操作,但应避免这样做。在一次迁移中同时运行数据和架构更改可能会导致某些数据库后端出现问题,因此应该完全避免。
归档时间: |
|
查看次数: |
18391 次 |
最近记录: |