Django model.save()不适用于loaddata

我有一个覆盖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)

提前致谢。


不你不是。 save()不是由loaddata按设计调用的(它的方式更耗费资源,我想)。 抱歉。

编辑:根据文档,预先保存也不被称为(即使显然它是?)。

根据https://docs.djangoproject.com/en/dev/ref/django-admin/#what-sa-fixture将数据保存到数据库中


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

所以我在Django 1.4上,这是我迄今为止发现的:

  • 你没有调用save()是正确的。 有一个特殊的DeserializedObject通过在Model类上调用save_base()进行插入 - 模型上的覆盖save_base()将不会执行任何操作,因为它无论如何都被绕过。
  • @Dave也是正确的:当前的文档仍然说预保存信号没有被调用,但它是。 它背后的条件是: if origin and not meta.auto_created
  • origin是模型被保存的类,所以我不明白为什么它会是虚假的。
  • meta.auto_created到目前为止我所尝试过的所有东西都是假的,所以我还不确定它的用途。 看看Options对象,它似乎与抽象模型有关。
  • 所以是的, pre_save信号确实正在发送。
  • 再往下,在同样条件下还有一个post_save信号也在发送。
  • 使用post_save信号起作用。 我的模型更加复杂,包括“已启用”模型上的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实例。

    链接地址: http://www.djcxy.com/p/9143.html

    上一篇: Django model.save() not working with loaddata

    下一篇: Authentication fails silently in Symfony2