gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:05:20 25 4
gpt4 key购买 nike

我有一个用于生成 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com