Django Model.object.get pre_save函数古怪

时间:2009-03-31 17:29:40

标签: python django django-models error-handling django-signals

我已经创建了一个连接模型'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。覆盖save方法非常有效。仍然对信号方法感到好奇。嗯,很奇怪。

编辑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()相同。

2 个答案:

答案 0 :(得分:1)

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

至于信号问题,我可以诚实地看到你的代码没有错。我甚至成功地在本地运行它。你确定你在问题中正确地表达了它吗?或者,instance2不是现有的数据库对象(可能是测试代码中的一个傻瓜)?

答案 1 :(得分:0)

感谢您发布此内容。最顶级的谷歌搜索结果(当时我发布这篇文章)有点过时,并显示了连接信号的旧方式(最近重写了这些信号)。您的修改以及更正后的代码段向我展示了它是如何完成的。

我希望更多的海报能够编辑他们的评论,以便修复它。谢谢。 : - )