2011-03-25 19 views
0

我想從模型的save方法中觸發一個視圖函數,以寫入或更新與該實例關聯的xml文件。將視圖函數導入到models.py - 通過覆蓋保存方法觸發

#models.py 
from myapp.views import updateXML, createXML 

class myModel(models.Model): 

    def save(self, *args, **kwargs): 
     if self.pk is not None: 
      updateXML(self) 
     else: 
      createXML(self) 
     super(FatherAgendaTemplate, self).save(*args, **kwargs) 

#views.py 
from myapp.models import otherModel 

def createXML(instance):  
    print "create XML" 
    print instance 

def updateXML(instance):  
    print "update XML" 
    print instance 

的問題是,我需要導入otherModel成有一個外鍵基於myModel的views.py,這會導致某種形式的衝突,我得到的錯誤:

ImportError: cannot import name createXML 

我想我會以這種錯誤的方式去做,在模型和視圖之間導入,因爲它會引發導入錯誤。什麼是正確的方法來做到這一點?當然,我可以在models.py中完成所有的xml編寫函數,並避免導入衝突,但這似乎是一個混亂的方法。

回答

2

createXMLupdateXML函數特定於該特定模型嗎?如果是這樣,而且很有可能,那麼做的最好的事情就是讓他們myModel方法:

class MyModel(models.Model): 
    ...fields... 


    def createXML(self): 
     ... do stuff with self ... 

    def save(self, *args, **kwargs): 
     if not self.pk: 
      self.createXML() 

等。對我而言,這是迄今爲止最好的解決方案,而且根本不麻煩。

但是,如果這確實不適合你,有許多方法可以避免導入問題。也許最好的做法是將XML函數放入第三個模塊中,例如lib.py,您可以將其導入到模型中。

第三種選擇是做保存方法本身的XML功能的進口,而不是在模塊級:

def save(self, *args, **kwargs): 
    from myapp.views import createXML, updateXML 

但是我覺得前兩個選項將是可取的。

+0

啊OK,第一個解決辦法是什麼我失蹤,使用自結合具體型號功能集成到模型DEFS。函數(),缺少這個概念。雖然我認爲最簡潔的解決方案是第二種,如果函數是以一種通用的方式在不同模型中使用,那我也會嘗試。謝謝! – HdN8 2011-03-25 10:06:59

1

首先,在發佈這些類型的問題時,它非常重要的是發佈或鏈接到所有相關代碼(即MyOtherModel)和完整的回溯。

追蹤導致錯誤的追蹤可以幫助您找出導致錯誤的原因,這可能與您無關,可能會成爲您的問題。

第二個問題:那些django視圖還是普通函數?視圖接受請求(帶或不帶參數)並返回一個Response對象。

一般而言,與對象(在本例中爲模型)一起操作或交互的函數應該是對象內的函數,所謂的方法,視圖應該調用這些方法。

class MyModel(models.Model): 
    name = models.CharField... 
    somethingelse = models.TextField... 

    my_method_to_create_pdf(self): 
     create_pdf(self.somethingelse) 

如果create_pdf使用不僅於此, 創建第三個文件,並導入這裏一個lib,但要具有與模型作爲方法做任何邏輯,對象應該是自包含的。在python

快速谷歌鏈接,面向對象的編程:http://www.voidspace.org.uk/python/articles/OOP.shtml

歡呼聲, 灰

+0

是的,我知道我的問題非常籠統,與具體錯誤沒有太大關係,所以我忽略了這些細節。偉大的投入,我在一定程度上濫用了我的視圖函數,並將一些函數應用到模型視圖中。感謝您爲我清除+1。 – HdN8 2011-03-25 10:11:02