ManyToManyField在post_save()函数中为空

时间:2013-04-09 09:54:46

标签: python django

将新记录添加到表中时,我必须在外部数据库上执行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帮助/建议?

1 个答案:

答案 0 :(得分:7)

这是因为您先保存实例,然后再添加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)