在 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】:这里有些混乱。
一旦你调用了super
,self.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 方法中删除内联对象