我对基于Django类的表单保存表单的方式有一个问题。我正在为我的一个模型使用form.ModelForm
,它有一些多对多的关系。在
在模型的save方法中,我检查其中一些关系的值以修改其他属性:
class MyModel(models.Model):
def save(self, *args, **kwargs):
if self.m2m_relationship.exists():
self.some_attribute = False
super(MyModel, self).save(*args, **kwargs)
即使我在我的表单中填充了m2m关系中的一些数据,当保存模型时,我self.m2m_relationship
,令人惊讶的是它是一个空的QuerySet
。我最终发现了以下几点:
调用form.save()
方法来保存表单,它属于BaseModelForm
类。然后这个方法返回save_instance
,一个forms\models.py
中的函数。此函数定义了一个局部函数save_m2m()
,它以一种形式保存多对多关系。在
事情是这样的,请查看save_instance
在保存时选择的顺序以及instance和m2m:
显然问题就在这里。首先调用实例的save
方法,这就是为什么self.m2m_relationship
是空的QuerySet
。只是还不存在。在
我能做些什么?我不能仅仅改变save_instance
函数中的顺序,因为它是Django的一部分,我可能会破坏其他东西。在
丹尼尔的回答给出了这种行为的原因,你无法纠正它。在
但是当m2m关系发生变化时,就会发送
m2m_changed
信号,也许您可以使用它:但是请注意,docs表示实例“可以是发送方的实例,也可以是ManyToManyField相关的类的实例”。在
我不知道它是如何工作的,但是你可以试试你得到的,然后修改代码。在
但是用其他方法是不可能的。在
多对多关系不是实例上的字段,而是链接表中的一个条目。在实例本身存在之前,不可能保存该关系,因为它没有ID进入链接表。在
相关问题 更多 >
编程相关推荐