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