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