3

我制作了一个连接到模型“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() 相同。

4

2 回答 2

1

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

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

于 2009-03-31T19:19:18.807 回答
0

感谢您发布此信息。谷歌排名靠前的结果(在我发布此内容时)有点过时,并且显示了连接信号的旧方式(显然最近被重写了)。您的编辑以及更正的代码片段向我展示了它是如何完成的。

我希望更多的海报编辑他们的评论以进行修复。谢谢。:-)

于 2009-04-24T03:48:50.217 回答