Skip to main content
 首页 » 编程设计

python之Django Model.object.get pre_save 函数奇怪

2025年05月04日23over140

我制作了一个连接到模型“pre_save”信号的函数。在函数内部,我试图检查模型实例的 pk 是否已经存在于表中:

sender.objects.get(pk=instance._get_pk_val()) 

模型的第一个实例引发错误。我发现错误并从标题生成一个 slug 字段。在第二种情况下,它不会抛出错误。我在两个实例上检查了 instance._get_pk_val() 的值,它们是相同的:无

所以:

# This one raises an error in the sluggit function 
instance1 = Model(title="title 1") 
instance1.save() 
 
# This one doesn't raise an error 
instance2 = Model(title="title 2") 
instance2.save() 

这是我使用 python 和 django 的第三天。所以,如果我没有看到它是什么新东西,我很抱歉。

编辑:

模型:

class Test(models.Model): 
    title = models.CharField(max_length=128) 
    slug = models.SlugField(max_length=128) 
    slug.prepopulate_from=('title',) 
 
signals.pre_save.connect(package.sluggit, sender=Test) 

函数基础:

def sluggit(sender, instance, signal, *args, **kwargs): 
    try: 
        sender.objects.get(pk=instance._get_pk_val()) 
    except: 
        # Generate Slug Code 

@S.Lot 告诉我在评论中覆盖 save() 方法。我得试试看。我仍然想知道为什么第二次调用 model.objects.get() 没有使用此方法引发错误。

编辑 2 谢谢@S.Lot。覆盖保存方法非常有效。仍然对信号方法感到好奇。嗯,很奇怪。

编辑 3 玩了一会儿之后,我发现使用 instance.objects.get() 而不是 sender.objects.get() 是可行的:

def sluggit(sender, instance, signal, *args, **kwargs): 
    try: 
        sender.objects.get(pk=instance._get_pk_val()) 
    except: 
        # Generate Slug Code 

需要:

def sluggit(sender, instance, signal, *args, **kwargs): 
    try: 
        instance.objects.get(pk=instance._get_pk_val()) 
    except: 
        # Generate Slug Code 

错误?出于某种原因,我认为 sender.objects.get() 与 Test.objects.get() 相同。

请您参考如下方法:

S.Lott 是正确的...使用 save(),因为您已经承认您已经开始这样做了。

至于信号问题,老实说我看不出你的代码有什么问题。我什至自己在本地成功运行过它。你确定你在问题中正确地代表了它吗?或者那个 instance2 还不是一个现有的数据库对象(可能是您的测试代码中的一个错误)?