gpt4 book ai didi

Django model.save() 不使用 loaddata

转载 作者:行者123 更新时间:2023-12-04 04:27:04 25 4
gpt4 key购买 nike

我有一个模型覆盖 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 钩子(Hook)信号让它工作,但这有点小技巧,如果能得到 save() 就好了。在职的。
def mymodel_pre_save(sender, **kwargs):
instance = kwargs['instance']
instance.slug = slugify(instance.name)

pre_save.connect(mymodel_pre_save, sender=MyModel)

提前致谢。

最佳答案

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

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

  • 你说得对save()不叫。有一个特殊的DeserializedObject通过调用 save_base() 进行插入在 Model 类上 - 覆盖 save_base()在你的模型上不会做任何事情,因为它无论如何都被绕过了。
  • @Dave 也是正确的:当前文档仍然说未调用预保存信号,但确实如此。它落后于一个条件:if origin and not meta.auto_created
  • origin是要保存的模型的类,所以我不明白为什么它会是虚假的。
  • meta.auto_created到目前为止,我尝试过的一切都是错误的,所以我还不确定它的用途。查看Options对象,似乎与abstract models有关.
  • 所以是的,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 的实例.

    关于Django model.save() 不使用 loaddata,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7508226/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com