Django model.save()无法处理loaddata
我有一个覆盖save()的模型,用于对字段进行slagify:Django model.save()无法处理loaddata,django,django-models,Django,Django Models,我有一个覆盖save()的模型,用于对字段进行slagify: class MyModel(models.Model): name = models.CharField(max_length=200) slug = models.SlugField(max_length=200) def save(self, *args, **kwargs): self.slug = slugify(self.name) super(MyModel, s
class MyModel(models.Model):
name = models.CharField(max_length=200)
slug = models.SlugField(max_length=200)
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(MyModel, self).save(*args, **kwargs)
当我运行load data加载夹具时,由于数据库中的slug字段为空,因此不会调用此save()
。我错过什么了吗
我可以通过一个pre_save hook信号让它工作,但这有点像黑客,如果save()
工作就好了
def mymodel_pre_save(sender, **kwargs):
instance = kwargs['instance']
instance.slug = slugify(instance.name)
pre_save.connect(mymodel_pre_save, sender=MyModel)
提前谢谢。不,你没有。save()不是由loaddata调用的,而是由设计调用的(我想这是一种资源密集型的方式)。对不起
编辑:根据文档,pre-save也不被调用(尽管它显然是?)
数据按原样保存到数据库中,根据我现在正在做类似的事情-我需要第二个模型为夹具中的每个第一个模型创建一个并行条目。第二个模型可以启用/禁用,并且必须在
loaddata
调用中保留该值。不幸的是,拥有一个具有默认值的字段(并将该字段保留在夹具之外)似乎不起作用-当加载夹具时,它会重置为默认值(否则两个模型可能会组合在一起)
我在Django 1.4上,这是我到目前为止发现的:
- 没有调用
,这是正确的。有一个特殊的save()
通过调用Model类上的反序列化对象
来执行插入-覆盖模型上的save_base()
不会做任何事情,因为它被绕过了save_base()
- @Dave也是正确的:当前的文档仍然说没有调用预保存信号,但它是。它背后有一个条件:
if origin and not meta.auto_created
是要保存的模型的类,所以我不明白为什么它会是falsyorigin
到目前为止,我所尝试的一切都是错误的,所以我还不确定它的用途。看看Options对象,它似乎与meta.auto_创建的
- 是的,确实发送了
信号pre_save
- 再往下看,在同样发送的条件后面有一个
信号post_save
from django.db.models.signals import post_save
class Info(models.Model):
name = models.TextField()
class Enabled(models.Model):
info = models.ForeignKey(Info)
def create_enabled(sender, instance, *args, **kwards):
if Info == sender:
Enabled.objects.get_or_create(id=instance.id, info=instance)
post_save.connect(create_enabled)
当然,
initial_data.json
只定义了Info
Hi@Dave的实例,谢谢你提供的信息。不过,它目前似乎正在使用预保存。上面的第二段代码确实导致模型实例在数据库中填充了slug字段。。。但后来医生们说了相反的话。但是我和你在同一个地方,从来没有让save()工作过。嗯,文档确实说pre_save不被调用。但是我刚刚调试了代码,它确实调用了pre_save。从跟踪到并运行。要么是文档错误,要么是bug?你肯定应该提交bug。