IntegrityError: column slug is not unique
IntegrityError: column slug is not unique
我正在通过 tangow 和 django 教程学习 django,在第 7 章我已经堆叠了。
我正在尝试在我的模型中包含一个 slug 字段并覆盖保存方法以使其全部正常工作。迁移后出现完整性错误。
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 属性指定为唯一,但您的 Category
class.
的多个实例必须具有相同的 slug 值
如果您向已有数据的 table 添加唯一属性列,这很容易发生,因为您使用的任何常量默认值都会自动打破唯一约束。
要进行迁移...
您需要先迁移以仅添加 slug-field,而不将其指定为 unqiue,然后为数据库中的每个 Category
设置一个唯一的 slug,然后您可以添加唯一的约束并再次迁移。
在您的应用的迁移目录中打开您最近的迁移并编辑类似于
的行
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 设置为类别的名称。现在,假设所有名称都是唯一的,您可以再次创建迁移并成功迁移,这样数据库将强制使用唯一的 slug。
我正在通过 tangow 和 django 教程学习 django,在第 7 章我已经堆叠了。
我正在尝试在我的模型中包含一个 slug 字段并覆盖保存方法以使其全部正常工作。迁移后出现完整性错误。
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 属性指定为唯一,但您的 Category
class.
如果您向已有数据的 table 添加唯一属性列,这很容易发生,因为您使用的任何常量默认值都会自动打破唯一约束。
要进行迁移...
您需要先迁移以仅添加 slug-field,而不将其指定为 unqiue,然后为数据库中的每个 Category
设置一个唯一的 slug,然后您可以添加唯一的约束并再次迁移。
在您的应用的迁移目录中打开您最近的迁移并编辑类似于
的行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 设置为类别的名称。现在,假设所有名称都是唯一的,您可以再次创建迁移并成功迁移,这样数据库将强制使用唯一的 slug。