You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:59:29