Django:如何创建自定义唯一Slug字段?
在Django模型中实现唯一Slug字段的方案
我在自己的Django项目里给Question模型添加Slug字段时,写了这套实现逻辑,既能自动生成符合规则的slug,还能保证唯一性,分享给大家:
from django.db import models from django.utils.text import slugify class Question(models.Model): question_text = models.CharField(max_length=250) slug = models.SlugField(max_length=255, unique=True) def _get_unique_slug(self): # 把问题标题转换成标准slug格式 slug = slugify(self.question_text) unique_slug = slug num = 1 # 如果当前slug已存在,循环添加数字后缀直到唯一 while Question.objects.filter(slug=unique_slug).exists(): unique_slug = f"{slug}-{num}" num += 1 # 处理极端情况:如果标题无法生成有效slug(比如全是特殊字符) if not unique_slug: # 有主键就用主键兜底,没有就用默认字符串 unique_slug = f"question-{self.pk}" if self.pk else "question" return unique_slug def save(self, *args, **kwargs): # 两种情况更新slug:1. 首次创建时slug为空;2. 问题标题被修改了 if not self.slug or (self.pk and Question.objects.get(pk=self.pk).question_text != self.question_text): self.slug = self._get_unique_slug() # 调用父类的save方法完成保存 super().save(*args, **kwargs)
一些细节说明:
- 我把生成slug的逻辑封装成了
_get_unique_slug内部方法,这样代码更清晰,也方便后续复用 - 特意加了空slug的兜底处理,避免因为标题内容特殊导致slug为空的报错
- 在save方法里做了判断,只有必要的时候才更新slug,不会每次保存都重新生成,性能更友好
内容的提问来源于stack exchange,提问作者user9649850
相关产品推荐
相关产品推荐

