【问题标题】:ManyToManyField is empty in post_save() functionpost_save() 函数中的 ManyToManyField 为空
【发布时间】:2013-04-09 09:54:46
【问题描述】:

当向表中添加新记录时,我必须在外部数据库上执行 SQL 语句。此查询包括使用 ManyToManyField。所以我只是像这样连接函数:

post_save.connect(post_save_mymodel, sender=MyModel)

在我的 post_save_mymodel() 函数中,这是我所做的:

def post_save_mymodel(sender, instance, created, *args, **kwargs):
    if created:
        for e in instance.my_m2mfield.all():
            # Query including "e".

但是,太糟糕了,instance.my_m2mfield.all() 总是空的!即使它们应该包含一些元素!我试图通过这样做来获得新元素

new_element = MyModel.objects.get(pk=instance.pk)

但它并没有改变任何东西,我仍然遇到同样的问题......

有什么帮助/建议吗?

【问题讨论】:

    标签: python django


    【解决方案1】:

    这是因为您首先保存实例,然后向其中添加 m2m 关系。这就是 ManyToMany 字段在 Django 数据模型中的工作方式。 Django 需要知道应该与 m2m 关系连接的项目的 ID。

    我认为您的代码如下所示:

    instance = MyModel.objects.create(some_field=some_value)  # post save signal triggered here
    instance.my_m2mfield = my_set_of_m2m_models
    

    您需要将处理程序连接到django.db.models.signals.m2m_changed 信号。见the docs。例如:

    def post_save_mymodel(sender, instance, action, reverse, *args, **kwargs):
        if action == 'post_add' and not reverse:
            for e in instance.my_m2mfield.all():
                # Query including "e"
    m2m_changed.connect(post_save_mymodel, sender=MyModel.my_m2mfield.through)
    

    【讨论】:

    • 此解决方案完美运行。所以我认为有必要精确属性,以便在正确的时间调用信号?无论如何,谢谢。
    • 细节中有魔鬼。如果清除了 m2m 字段的内容,则不会调用 post_save_model 处理程序并将操作设置为“post_add”。您可能想要检测该事件。有一个“post_clear”操作,但不幸的是,Django 似乎在更改 m2m 字段之前清除它们,因此在更改 m2m 字段期间以及清除它时会生成“post_clear”事件。
    • @Deneuve,“精确属性”是什么意思?
    猜你喜欢
    • 1970-01-01
    • 2016-05-04
    • 2014-12-18
    • 1970-01-01
    • 2017-10-09
    • 2020-04-12
    • 2011-09-18
    • 1970-01-01
    • 2011-05-30
    相关资源
    最近更新 更多