IntegrityError:列slug不是唯一的

alo*_*oha 4 python django

我正在通过tangowithdjango教程学习django,在第7章我已经堆积了.

我正在尝试在我的模型中包含一个slug字段并覆盖save方法以使其全部工作.迁移后我有完整性错误.

models.py:

class Category(models.Model):

    name = models.CharField(max_length=128, unique=True)
    views = models.IntegerField(default=0)
    likes = models.IntegerField(default=0)
    slug = models.SlugField(unique=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(Category, self).save(*args, **kwargs)

    class Meta:
        verbose_name_plural = "Categories"

    def __unicode__(self):
        return self.name
Run Code Online (Sandbox Code Playgroud)

谢谢!

rfj*_*001 9

听取错误.您将slug属性指定为唯一,但是对于您的Category类的多个实例,您必须具有相同的slug值.

如果向已有数据的表添加唯一属性列,则很容易发生这种情况,因为您使用的任何常量默认值都将自动中断唯一约束.

要进行迁移......

您将需要先迁移到只添加slug-field,而不指定为unqiue,然后为Category数据库中的每个设置一个唯一的slug ,然后您可以添加唯一约束并再次迁移.

在应用的迁移目录中打开最近的迁移,然后编辑与其类似的行

migrations.AddField(
    model_name='category',
    name='slug',
    field=models.SlugField(unique=True),
    preserve_default=False,
),
Run Code Online (Sandbox Code Playgroud)

所以它就是这样

migrations.AddField(
    model_name='category',
    name='slug',
    field=models.SlugField(null=True, blank=True),
    preserve_default=False,
),
Run Code Online (Sandbox Code Playgroud)

然后运行迁移python manage.py migrate(如果你使用django 1.7.否则使用South进行迁移),然后打开django shell python manage.py shell,导入你的Category模型并运行

for cat in Category.objects.all():
    cat.slug = cat.name
    cat.save()
Run Code Online (Sandbox Code Playgroud)

这会将每个类别的slug设置为类别的名称.现在,假设所有名称都是唯一的,您可以再次创建迁移并成功迁移,以便DB强制使用唯一的slug.