【问题标题】:Getting ID of newly created object in save()在 save() 中获取新创建对象的 ID
【发布时间】: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 不会出现。有什么办法让这些起来吗?

【问题讨论】:

    标签: django model save


    【解决方案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。然后我调用了保存的项目并用新值保存了它。
    猜你喜欢
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    相关资源
    最近更新 更多