python - 模型实例未反射(reflect)从自定义字段中的 pre_save 传递的数据

标签 python django

我有一个用于生成 slug 的自定义字段,并且我在我的模型中使用它。

奇怪的是,我无法弄清楚为什么我在此自定义字段的方法 pre_save 中生成的值没有在当前实例上设置。

我的问题不是关于以不同方式生成 slug,而是关于这种行为。

为了简化这个例子,我定义了这个类:

型号:

class MyModel(models.Model):
    slug = MyCustomField(blank=True)

    def save(self, *args, **kwargs):
        super(MyModel, self).save(*args, **kwargs)
        print 'in save'
        print self.slug

字段:

class MyCustomField(models.SlugField):
    def pre_save(self, model_instance, add):
        value = super(MyCustomField, self).pre_save(model_instance, add)
        if not value:
            value = 'random-generated-slug'
        return value

保存后信号:

@receiver(post_save, sender=MyModel)
def test(sender, **kwargs):
    print 'in signal'
    print kwargs['instance'].slug
    print 'from database'
    print MyModel.objects.get(pk=kwargs['instance'].pk).slug

要运行的代码:

instance = MyModel()
instance.save()
>> 'in signal'
>> ''
>> 'in database'
>> 'random-generated-slug'
>> 'in save'
>> ''
instance.slug
>> ''

如您所见,该值是在数据库中设置的,但它不在当前实例上,也不在 post_save 信号中。

我有 Django 版本 1.10。我应该在 MyCustomField 中以不同的方式设置值吗?这是怎么回事?

编辑: 也许我应该在字段的 save_form_data 中设置此值,或者最好的位置在哪里?

最佳答案

实例的 slug 字段在调用保存和写入数据库之间更新。当前实例的 slug 值已过时

要获取写入数据库的 slug 值,必须通过从数据库重新获取来更新实例:

instance = MyModel.objects.get(pk=your_pk)

关于python - 模型实例未反射(reflect)从自定义字段中的 pre_save 传递的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39878528/

相关文章:

python - 从单个 View 提供多个模板(或者我应该使用多个 View ?)

python - 多处理仅运行第一行代码

python - Python Flask 是否有更简洁的方式来管理像 Express.js 这样的 mimetype?

python - 使用 sum() 连接元组

django - 如何向 Django 中的模型添加临时字段?

mysql - Django 从 MySQL 迁移到 Postgres

python - 在 Git Bash 中启动 Python 脚本

python - Django 中代码覆盖率的可视化报告

python - django - 将列表转换回查询集

python - 网站本地化、标题大写和避免重复