我有一个模型,它覆盖了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)
提前致谢。
答案 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()
将无法执行任何操作,因为它无论如何都会被绕过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
的实例。