У меня есть модель с двумя полями, как показано нижеПриращение слизняка, избегая ошибки целостности в моделях Джанго сохранить метод
models.py
class Publisher(models.Model):
name = models.CharField(max_length=200)
slug = models.SlugField(max_length=150, unique=True)
def save(self, *args, **kwargs):
if not self.id and not self.slug:
slug = slugify(self.name)
try:
slug_exits = Publisher.objects.get(slug=slug)
if slug_exits:
self.slug = slug + '_1'
except Publisher.DoesNotExist:
self.slug = slug
super(Publisher, self).save(*args, **kwargs)
Здесь я создаю слизняка на основе name
как мы можем видеть выше
Поэтому, когда мы пытаемся создать издателя с name already exists
, метод модели save
добавит _1
до конца.
И когда мы снова попытаться создать новую запись с такими же name
, Integrity
ошибки будет поднята, как показано ниже
>> Publisher.objects.create(name="abc")
result: slug will be "abc"
>> Publisher.objects.create(name="abc")
result: slug will be "abc_1"
>> Publisher.objects.create(name="abc")
result:
.................
.................
34 del cursor
35 del connection
---> 36 raise errorclass, errorvalue
37
38 re_numeric_part = re.compile(r"^(\d+)")
IntegrityError: (1062, "Duplicate entry 'abc_1' for key 'slug'")
Так что я хочу, если название/пробковое уже существует в базе данных и если пробкового содержит число в ней (в конце, как аЬс _1
), мы должны увеличивать его, что число
так что все, что я хочу, чтобы increment the number in the slug
, как показано ниже, если название/пробкового уже существует в базе данных
abc
abc_1
abc_2
abc_3
Так может кто угодно, пожалуйста, дайте мне знать, как реализовать вышеприведенную логику приращения пули?
Заранее спасибо ......
Зачем вам это нужно? Почему бы просто не создать у пользователя уникальное имя пользователя Slook? –
На самом деле slug - это уникальное поле, но когда разработчик или администратор пытается создать его из оболочки python (django), мы должны позаботиться о дублировании –