繁体   English   中英

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

[英]Django - Slugs - Key (slug)=() is duplicated

刚刚开始玩弄 Django,并在这里找到了一个关于如何创建 slug 的链接。 我被告知对现有模型执行以下更改:

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

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

python manage.py migrate

上面返回“详细信息:密钥(slug)=()是重复的。”

我不完全确定为什么会发生这种情况。 也许是因为我添加了一个独特的新字段,但我无法用 '' 填充它? 如果是这样,我必须做什么才能填充数据库?

该文档解释了如何在这些情况下进行迁移 快速总结:

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

实际上我找到了一种更简单的方法来覆盖管理过滤器列表,它修复了我重复字段的错误,因此您可以过滤管理面板中的字段以获取所有重复的字段并重命名它们......然后迁移..它删除所有重复后将工作..

首先创建 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)

祝你好运

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM