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