Python IntegrityError:列段塞不是唯一的

Python IntegrityError:列段塞不是唯一的,python,django,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 = m

我正在通过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

谢谢

倾听错误。您将slug属性指定为unique,但对于
类别
类的多个实例,必须具有相同的slug值

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

要进行迁移

首先需要迁移,只添加slug字段,而不将其指定为unqiue,然后为数据库中的每个
类别设置唯一slug,然后可以添加唯一约束并再次迁移

在应用程序的migrations目录中打开您最近的迁移,并编辑类似于的行

migrations.AddField(
    model_name='category',
    name='slug',
    field=models.SlugField(unique=True),
    preserve_default=False,
),
所以它只是

migrations.AddField(
    model_name='category',
    name='slug',
    field=models.SlugField(null=True, blank=True),
    preserve_default=False,
),
然后使用
python manage.py migrate
运行迁移(如果您使用的是django 1.7,否则使用South进行迁移),然后使用
python manage.py shell
打开django shell,导入您的类别模型并运行

for cat in Category.objects.all():
    cat.slug = cat.name
    cat.save()

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

我向其添加了一个“”默认值,如何轻松修复它?向已包含数据的表添加唯一字段需要一些工作。我编辑我的帖子是为了帮助你度过难关。首先需要迁移以添加字段,然后为表中的每一行的字段设置一个唯一值,然后可以再次迁移以添加唯一性约束Hanks!你让我理解了这个“slugy”问题。你还应该指定NULL=true,否则migrate to add slug字段也会失败。但是,如何在shell中运行这个多行for循环呢?