8

当向表中添加新记录时,我必须在外部数据库上执行 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)

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

Wny 帮助/建议?

4

1 回答 1

11

这是因为您首先保存您的实例,然后再向其中添加 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信号。请参阅文档。例如:

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)
于 2013-04-09T11:03:42.477 回答