Django model.save()不使用loaddata

时间:2011-09-22 00:25:27

标签: django django-models

我有一个模型,它覆盖了save()来强制一个字段:

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)

当我运行加载数据来加载夹具时,似乎没有调用此save(),因为数据库中的slug字段为空。我错过了什么吗?

我可以通过pre_save挂钩信号来使用它,但这有点像黑客,让save()工作会很好。

def mymodel_pre_save(sender, **kwargs):
    instance = kwargs['instance']
    instance.slug = slugify(instance.name)

pre_save.connect(mymodel_pre_save, sender=MyModel)

提前致谢。

2 个答案:

答案 0 :(得分:2)

不,你不是。 load()不是由loaddata按设计调用的(我认为它的资源密集程度更高)。遗憾。

编辑:根据文档,预先保存也没有被调用(尽管它显然是?)。

根据https://docs.djangoproject.com/en/dev/ref/django-admin/#what-s-a-fixture

,数据按原样保存到数据库中

答案 1 :(得分:1)

我现在正在做类似的事情 - 我需要第二个模型为灯具中的每个第一个模型都有一个并行条目。可以启用/禁用第二个模型,并且必须在loaddata个调用之间保留该值。不幸的是,拥有一个具有默认值的字段(并将该字段留在灯具外)似乎不起作用 - 当加载灯具时,它会被重置为默认值(否则两个模型可能已合并)。 / p>

所以我在使用Django 1.4,这是我到目前为止所发现的:

  • 你没有调用save()你是对的。通过在模型上调用DeserializedObject进行插入有一个特殊的save_base() - 覆盖模型上的save_base()将无法执行任何操作,因为它无论如何都会被绕过
  • @Dave也是正确的:当前的文档仍然表示没有调用预保存信号,但它是。这是一个条件背后的原因:if origin and not meta.auto_created
    • origin是要保存的模型的类,所以我不明白为什么它会被伪造。
    • 到目前为止,
    • meta.auto_created对我所尝试过的一切都是假的,所以我还不确定它是什么用的。查看Options对象,它似乎与abstract models
    • 有关
    • 是的,确实发送了pre_save信号。
  • 再向下,同样条件背后还有一个post_save信号也在发送。

使用post_save信号有效。我的模型更复杂,包括“Enabled”模型上的ManyToMany,但基本上我是这样用的:

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的实例。