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

标签 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。覆盖保存方法非常有效。仍然对信号方法感到好奇。嗯,很奇怪。

编辑 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/

相关文章:

python - 基于 http Web 服务的简单 XML

python - 使用 slug 字段找不到反向

python - xlrd 将数字读取为字符串

python - np.ndarray` "is"中的奇怪行为

Django 管理员与折叠字段集的纠结

python - Django Celery 缓存锁不起作用?

django - 尽量避免循环导入

django - 显示特定用户 django 的模型值

python - 从 heroku 上的 rails 应用程序安装 pip 模块

python - 为什么 string.split ('\n' ) 在输出列表中添加一个额外的元素?