Django - Slugs - Key(slug)=()是重复的

时间:2015-07-01 13:21:47

标签: python django

刚刚开始使用Django,并且遇到了关于如何创建slug的链接here。有人告诉我对现有模型进行以下更改:

CurrencySelect.ClickListener {
    var Selected = this.value;
    var Rate = Conversions[Selected];
    LoopThroughAllPriceElements {
        var NewPrice = CurrentPrice/Text * Rate
        ThisPriceElementsText = NewPrice
    }
    FunctionToSaveSelectionToCookie(Rate);
}
LoadRateFrom(Cookie);

在我尝试使用以下命令迁移数据库之前,这很顺利。

from django.template.defaultfilters import slugify

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)

    def __unicode__(self):
        return self.name

以上问了一个默认值,所以按照指南,我给了它''。然后:

python manage.py makemigrations

以上返回" DETAIL:Key(slug)=()是重复的。"

我不完全确定为什么会这样。也许是因为我添加了一个独特的新领域,我不能用“'”填充它。如果是这样,我需要做什么才能填充数据库?

2 个答案:

答案 0 :(得分:7)

文档explains how to migrate in these circumstances。快速摘要:

  • 创建没有unique = True
  • 的字段
  • 使用RunPython函数创建一个迁移,该函数遍历所有类别并调用保存它们,这将填充slug
  • 创建最终迁移,设置unique = True。

答案 1 :(得分:0)

实际上,我发现了一种更容易的方法来覆盖管理过滤器列表,从而解决了重复字段的错误,因此您可以在管理面板中过滤这些字段,以获取所有重复的字段并重命名它们,然后进行迁移。 。,它将在删除所有重复项后起作用。

首先创建custom_filter.py文件,并在其中包含此代码(假设您有一个名称为slug的字段)

from django.contrib.admin import SimpleListFilter


class DuplicatSlugFilter(SimpleListFilter):
    """
    This filter is being used in django admin panel.
    """

    title = "Duplicates"
    parameter_name = "slug"

    def lookups(self, request, model_admin):
        return (("duplicates", "Duplicates"),)

    def queryset(self, request, queryset):
        if not self.value():
            return queryset
        if self.value().lower() == "duplicates":
            return queryset.filter().exclude(
                id__in=[slug.id for slug in queryset.distinct("slug").order_by("slug")]
            )

然后将这些行添加到admin.py文件中:

from .custom_filter import DuplicatSlugFilter


class CategoryAdmin(admin.ModelAdmin):
    list_filter = (DuplicatSlugFilter,)

admin.site.register(Category, CategoryAdmin)

祝你好运