簡體   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