我有一个用于生成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
中设置此值,或者哪个地方最适合这样做?
答案 0 :(得分:1)
实例的slug字段在保存调用和写入数据库之间进行了更新。当前实例的slug值为陈旧
要获取写入数据库的slug值,实例必须通过 refetching 从数据库中更新:
instance = MyModel.objects.get(pk=your_pk)