我制作了一个连接到模型“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 还不是一个现有的数据库对象(可能是您的测试代码中的一个错误)?
关于python - Django Model.object.get pre_save 函数奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/702150/