簡體   English   中英

Django模型表單在實例后保存m2m

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM