通过避免 django 模型保存方法中的完整性错误来增加 slug
Posted
技术标签:
【中文标题】通过避免 django 模型保存方法中的完整性错误来增加 slug【英文标题】:Incrementing the slug by avoiding Integrity error in django models save method 【发布时间】:2013-08-13 11:16:53 【问题描述】:我有一个包含两个字段的模型,如下所示
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
字段的 slug,正如我们在上面看到的那样
所以当我们尝试使用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'")
所以我想要的是如果标题/slug 已经存在于数据库中,并且如果 slug 中包含数字(最后像 abc_1
),我们应该增加它的数字
如果数据库中已经存在标题/slug,我想要的只是increment the number in the slug
,如下所示
abc
abc_1
abc_2
abc_3
那么谁能告诉我如何实现上述增加 slug 的逻辑?
提前致谢......
【问题讨论】:
你为什么要这个?为什么不让用户想出一个独特的 SEO 友好的 slug 名称? 其实 slug 是一个独特的字段,但是当开发人员或管理员尝试从 python(django) shell 创建它时,我们应该注意重复 【参考方案1】:您将不得不使用循环而不是仅使用一个条件。试试这个:
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)
slug_exists = True
counter = 1
self.slug = slug
while slug_exists:
try:
slug_exits = Publisher.objects.get(slug=slug)
if slug_exits:
slug = self.slug + '_' + str(counter)
counter += 1
except Publisher.DoesNotExist:
self.slug = slug
break
super(Publisher, self).save(*args, **kwargs)
【讨论】:
我认为这条线 slug = self.slug + '' + str(counter) 应该是 self.slug = slug + '' + str(counter)跨度> 在这种情况下这也不起作用,当我尝试创建具有相同名称的发布者时,它被击中,意味着循环没有中断 @shivakrishna,不应该像答案slug = self.slug + '_' + str(counter)
中写的那样。您被答案中的代码卡住了吗?
实际上,当我尝试从终端创建记录时,创建记录需要很长时间(没有响应),我的意思是循环没有中断
也保存在数据库中,如_1、_2等,但我们需要的是abc_1、abc_2对吗?以上是关于通过避免 django 模型保存方法中的完整性错误来增加 slug的主要内容,如果未能解决你的问题,请参考以下文章