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

Django预保存Slug生成函数本地失效,部署环境正常求解决方案

Django本地pre_save生成唯一Slug功能失效排查方案

问题背景

使用Django开发狗狗领养网站,通过pre_save信号为新增狗狗生成唯一Slug字段,部署环境功能正常,但本地环境该功能突然失效,且本地与部署环境代码完全一致,需排查解决以继续开发。

相关代码

Dogs模型(models.py):

class Dogs(models.Model):
    dog_id = models.AutoField(primary_key=True)
    dog_name = models.CharField(max_length=100)
    dog_slug = models.SlugField(unique=True, null=True, blank=True)
    breed = models.ForeignKey(Dog_breed, on_delete=models.CASCADE)
    dogs_image = models.ImageField(upload_to='media/')
    description = models.TextField(default="Description information to be added soon")
    dog_illness_disability = models.BooleanField(null=True, blank=True)
    can_live_with_cats = models.BooleanField(null=True, blank=True)
    can_live_with_dogs = models.BooleanField(null=True, blank=True)
    can_be_with_children = models.BooleanField(null=True, blank=True)
    hours_excercise_required = models.IntegerField(default=0)
    dog_sociability = models.IntegerField(default=0)
    can_be_left_alone = models.IntegerField(default=0)
    weight_kg = models.FloatField(default=0)
    size_range = models.IntegerField(default=0)
    affection_level = models.IntegerField(default=0)
    training_level = models.IntegerField(default=0)
    energy_level = models.IntegerField(default=0)
    age = models.IntegerField(default=0)
    age_range = models.IntegerField(default=0)
    male_female = models.BooleanField(null=True, blank=True)
    neutered = models.BooleanField(null=True, blank=True)

slugify.py:

def unique_slug(instance, generated_slug = None):
    if generated_slug is not None: 
        slug = generated_slug
    else:
        slug = slugify(instance.dog_name)   
    #check if a dog with that slug already exists. If so generate a random string of numbers and characters to create a unique slug
    qs = Dogs.objects.filter(dog_slug=slug).exclude(dog_id=instance.dog_id)
    if qs.exists():
        random_str = get_random_string(length=4)
        random_num = random.randint(100_00, 500_000)
        slug = f"{slug}-{random_num}-{random_str}"
        return unique_slug(instance, generated_slug=slug)
    return slug
   
def pre_save_receiver(sender, instance, *args, **kwargs): 
   if not instance.dog_slug: 
       instance.dog_slug = unique_slug(instance) 

pre_save.connect(pre_save_receiver, sender = Dogs) 

排查与解决方案

1. 确认信号是否被正确注册

Django的pre_save信号需要确保包含信号注册的文件被项目加载,常见问题是slugify.py未被自动导入:

  • 在models.py末尾添加导入语句:from .slugify import *
  • 或者在app的apps.py中配置ready()方法手动导入:
    from django.apps import AppConfig
    
    class YourAppConfig(AppConfig):
        default_auto_field = 'django.db.models.BigAutoField'
        name = 'your_app_name'
    
        def ready(self):
            import your_app_name.slugify
    
    之后在settings.py的INSTALLED_APPS中替换原app名为your_app_name.apps.YourAppConfig

2. 补充函数依赖导入

slugify.py中使用了slugify、get_random_string和random模块,但代码未显示导入,本地环境可能因缺少导入导致报错中断逻辑。在slugify.py开头添加:

from django.utils.text import slugify
from django.utils.crypto import get_random_string
import random

3. 本地调试信号执行流程

在pre_save_receiver中添加打印日志,确认函数是否被触发、dog_slug是否为空:

def pre_save_receiver(sender, instance, *args, **kwargs): 
    print(f"[DEBUG] 当前dog_slug: {instance.dog_slug}")
    if not instance.dog_slug: 
        instance.dog_slug = unique_slug(instance)
        print(f"[DEBUG] 生成的新slug: {instance.dog_slug}")

启动本地服务后新增狗狗,查看控制台输出,确认是否进入slug生成逻辑。

4. 核对依赖版本一致性

运行pip show django查看本地Django版本,对比部署环境版本,确认是否因版本差异导致信号行为变化。若版本不一致,将本地版本调整为与部署环境一致。

5. 检查本地数据库状态

  • 运行python manage.py migrate确保本地数据库结构与部署环境一致
  • 若本地数据库存在异常数据(如dog_slug为空但已存在的重复记录),可清空本地数据库后重新创建测试数据,验证功能是否恢复

内容的提问来源于stack exchange,提问作者Cameron1996

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 04:06:20