[英]Django model form saves m2m after instance
我對基於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
在保存和實例以及m2m時選擇的順序:
instance.save()
save_m2m()
顯然問題出在這里。 首先調用實例的save
方法,這就是self.m2m_relationship
是一個空QuerySet
的原因。 它只是不存在。
我該怎么辦? 我不能只是在save_instance
函數中更改順序,因為它是Django的一部分,而且我可能會破壞其他內容。
但是不可能以其他方式做到這一點。
多對多關系不是實例上的字段,而是鏈接表中的條目。 在實例本身存在之前,無法保存該關系,因為它沒有ID可以輸入到該鏈接表中。
Daniel的回答給出了此行為的原因,您將無法修復它。
但是,只要m2m關系發生變化,就會發送m2m_changed
信號,也許您可以使用該信號:
from django.db.models import signals
@signals.receiver(signals.m2m_changed, sender=MyModel.m2m_relationship.through)
def handle_m2m_changed(sender, instance, action, **kwargs):
if action == 'post_add':
# Do your check here
但是請注意文檔說實例“可以是發送者的實例,也可以是ManyToManyField所關聯的類的實例”。
我不知道它是如何工作的,但是您可以嘗試一下,然后修改代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.