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()
将不会执行任何操作,因为它无论如何都被绕过。 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
实例。