Слизняки Джанго не уникальны с уникальным = True - PullRequest
1 голос
/ 07 октября 2019

Я создал две статьи с названием «тест», и это то, что вторая генерирует как ошибку:

duplicate key value violates unique constraint "xxx_content_slug_xxxx_uniq"
DETAIL:  Key (slug)=(test) already exists.

Зная, что это моя модель:

class Content()
    slug = models.SlugField(unique=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Content, self).save(*args, **kwargs)

и зная, что я выполнил миграцию в БД.

Я не знаю, как решить эту проблему.

Примечание: Проблема генерируется из сообщения класса, которое наследует класс содержимого, и яне думаю, что эта информация поможет в этом контексте.

1 Ответ

1 голос
/ 07 октября 2019

slugify не проверяет уникальность, поэтому, если вы создадите две статьи с одинаковым названием, slugify(self.title) собирается сгенерировать один и тот же слаг дважды, что, конечно, заставит базу данных пожаловаться на нарушение уникальногоограничение.

Установка unique = True для поля не будет автоматически создавать уникальные значения для каждого нового экземпляра, она только создаст ограничение для базы данных, что одно и то же значение не может быть сохранено дважды.

Вы можете использовать django-autoslug , которая является библиотекой, которая делает именно то, что вам нужно.

Просто установите пакет и реализуйте свои поля следующим образом:

from django.db.models import CharField, Model
from autoslug import AutoSlugField

class Content(models.Model)
    title = CharField(max_length=200)
    slug = AutoSlugField(populate_from='title')

AutoSlugField выполняет следующие действия:

  1. заполняет себя из другого поля,
  2. сохраняет уникальность значения и
  3. использует настраиваемое slugify() работает лучше для i18n.

(Кроме того, я предполагаю, что Content является подклассом Model, иначе ваш код не будет работать вообще.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...