2011-06-01 64 views
7

我遇到了一個奇怪的問題,我希望這裏有人能夠闡明一些問題。ManyToMany字段在使用Django時未保存admin

運行super()後,我重寫了模型的save()方法以將一些值添加到ManyToMany字段。我的問題是,當我在Django admin中保存時,這些值似乎會添加到關係中,但是會再次變爲空。

但是,如果我從manage.py shell這樣做,它沒有問題。

我已經把兩個打印語句放在那裏,不管我是通過Django的管理員還是通過shell運行它,它們都會產生完全相同的輸出。

class Store(models.Model): 
    holidays = models.ManyToManyField(StoreHoliday, blank=True) 
    copy_holidays_from = models.ForeignKey('Store', blank=True, null=True) 

    def save(self): 
     print '==== BEFORE SAVE:', self.holidays.all() 
     super(Store, self).save() 
     self.copy_holidays() 
     print '==== AFTER SAVE:', self.holidays.all() 

    def copy_holidays(self): 
     if self.pk and self.copy_holidays_from: 
      self.holidays.clear() 
      for h in self.copy_holidays_from.holidays.all(): 
       self.holidays.add(h) 

這是print語句的輸出:

==== BEFORE SAVE: [] 
==== AFTER SAVE: [<StoreHoliday: 10 Mar 2010, Chuck Norris birthday (Closed)>] 

有誰有什麼可能導致這有什麼建議?

編輯:在通過管理界面進行保存時,所有對save()中m2m關係的手動更改似乎都被Django丟棄。這與它如何處理表單有關?

+0

我不知道你的問題在哪裏,但'self.holidays = self.copy_holidays_from.holidays.all()'看起來好多了,然後清理和迭代。 – DrTyrsa 2011-06-01 11:25:36

+0

謝謝你的提示,我不知道這是可能的。你可以在下面看到我做錯了什麼。 – 2011-06-01 15:47:26

回答

10

所以事實證明,上述不是實施它的正確方法。該代碼屬於StoreAdmin,通過重寫model_save()。

這是我如何解決它:

class StoreAdmin(admin.ModelAdmin): 
    def save_model(self, request, obj, form, change): 
     if obj.copy_holidays_from: 
      form.cleaned_data['holidays'] = obj.copy_holidays_from.holidays.all() 

     super(StoreAdmin, self).save_model(request, obj, form, change) 
2

我今天也許碰到了這個相同的行爲,是的,你是在假設它涉及到Django是如何處理的數據是正確的。

django admin將更改爲ManyToMany字段與更改實際對象分開。 (請記住,m2m保存在不同的數據庫表中)。

在我的情況下,如果我沒有在管理站點的ManyToMany字段中選擇任何內容,這將轉化爲對ManyToMany關係的clear()操作。您在save()方法中執行的所有操作都會立即被清除。我在post_save信號處理程序中做了同樣的事情。

解決方案(對我來說)是將ManyToMany字段分隔成一個內聯,因此在修改對象時它不會自動保存爲空。

+0

你好Jyrsa,我有一個類似的問題與Django管理員。我們有一個m2m字段,有時會在保存頁面的其餘部分時清除。我不知道Django單獨保存它。你能否聯繫我一些關於如何處理m2m的更多信息?你能否更具體地瞭解在什麼情況下保存方法的動作被清除?謝謝! – iank 2014-10-22 15:42:46

+0

iank:此錯誤報告可能有所幫助: https://code.djangoproject.com/ticket/6707 – 2015-10-06 05:39:33

相關問題