在 save() 中获取新创建对象的 ID

Posted

技术标签:

【中文标题】在 save() 中获取新创建对象的 ID【英文标题】:Getting ID of newly created object in save() 【发布时间】:2011-08-05 20:14:58 【问题描述】:

我想保存一个对象,以便 M2M 得到保存。然后我想读出 M2M 字段做一些计算并在保存的对象上设置一个字段。

class Item(models.Model):
    name = models.CharField(max_length=20, unique=True)
    product = models.ManyToManyField(SomeOtherModel, through='SomeTable')

    def save(self, *args, **kwargs):
        super(Item, self).save(*args, **kwargs)
        m2m_items = SomeTable.objects.filter(item = self)
        # DO SOME STUFF WITH THE M2M ITEMS

m2m_items 不会出现。有什么办法让这些起来吗?

【问题讨论】:

【参考方案1】:

这里有些混乱。

一旦你调用了superself.id 就会有一个值。

但是,我不明白您的filter 电话的意义。首先,您可能指的是get 而不是filter,因为过滤器获取的是查询集,而不是单个实例。但即便如此,调用也毫无意义:您刚刚保存了它,因此从数据库中返回的任何内容都将完全相同。有什么意义?

问题更新后编辑好的,感谢您的澄清。但是,模型的save() 方法不负责对 M2M 项目进行任何操作。它们需要单独保存,这是表单或视图的工作。

【讨论】:

对不起,我把信息弄错了。我重写了我的问题。我所做的是尝试获取many2many 项目。但由于某种原因,他们不会出现 感谢您的回答。我现在尝试使用 m2m_changed 信号。 models.signals.m2m_changed.connect(set_total_price, sender=Deal.product.through) 由于某种原因它不会调用我的 set_total_price 方法。它适用于 post_save 信号......嗯,我有一些事情要再试一次。非常感谢。 进一步阅读:我最终通过迭代实例来阅读 save_formset 中的 M2M。然后我调用了保存的项目并用新值保存了它。

以上是关于在 save() 中获取新创建对象的 ID的主要内容,如果未能解决你的问题,请参考以下文章

django admin 在 save_model 方法中删除内联对象

sqlachemy 获取新创建对象的id,flush与commit

Symfony2:获取持久化对象的 id

Django:保存创建对象实例的用户

创建新对象时在数据库中保存用户 ID

获取使用 Ebean 在 Play Framework 中保存的最新更新行