Django model.save()无法处理loaddata

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

我有一个覆盖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, 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
    • origin
      是要保存的模型的类,所以我不明白为什么它会是falsy
    • meta.auto_创建的
      到目前为止,我所尝试的一切都是错误的,所以我还不确定它的用途。看看Options对象,它似乎与
    • 是的,确实发送了
      pre_save
      信号
  • 再往下看,在同样发送的条件后面有一个
    post_save
    信号
使用post_保存信号有效。我的模型更复杂,包括“启用”模型上的许多模型,但基本上我是这样使用的:

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。