模型实例不反映自定义字段中从pre_save传递的数据

时间:2016-10-05 15:48:27

标签: 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中设置此值,或者哪个地方最适合这样做?

1 个答案:

答案 0 :(得分:1)

实例的slug字段在保存调用和写入数据库之间进行了更新。当前实例的slug值为陈旧

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

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