2013-05-02 67 views
1

我正在創建產品ID轉換應用程序。我有兩個型號表示兩個ID風格:將第三方模塊合併到Django模型中

class Id1(models.Model): 
    number = models.CharField(max_length=10) 
    converted = models.CharField(max_length=13) 
    status = models.CharField(max_length=5) # validation status 
    error = models.CharField(max_length=10) # error message 

    def __unicode__(self): 
     return self.number 

class Id2(models.Model): 
    number = models.CharField(max_length=13) 
    converted = models.CharField(max_length=10) 
    status = models.CharField(max_length=5) # validation status 
    error = models.CharField(max_length=10) # error message 

    def __unicode__(self): 
     return self.number 

有一個第三方Python(非Django的)模塊,我想納入Django模型有兩個原因:

  1. 它已經提供了我需要的轉換功能
  2. 我想在轉換中使用面向對象的方法 - 我創建了一個封裝了該實例的相關數據和方法的類的實例(例如Id1)。

第三方模塊具有若干字段,並且每個方法以下類:

  • 類ID(對象)
  • 類Id1的(Id)的
  • 類Id2的(Id)的

...以及類方法調用的以下頂級函數:

  • 高清驗證
  • 高清轉換
  • 高清calculate_checksum
  • 高清潔淨

不過,我不希望在數據庫中的第三方模塊的屬性;每個數據庫表應該只包含Django模型字段(數字和轉換)。

這是如何實現的?如果這是不可能的,有什麼其他的方法來解決這個問題?將邏輯委託給視圖?

[編輯]我忘了補充一點,我想使用模塊方法來初始化一些字段,如「轉換」,「狀態」和「錯誤」。任何想法如何做到這一點?

+0

這是不是很清楚你在這裏問什麼。你想使用現有的代碼來進行轉換/計算嗎?那麼你爲什麼不從模型的方法中調用這些函數等呢? – UloPe 2013-05-02 12:53:59

+0

你說得對。我忘了提及一個關鍵方面:我想將方法​​返回值保存爲模型字段。所以自定義的save()方法將包含模塊中的代碼,例如將Id1轉換爲Id2並將結果保存在「已轉換」字段中。驗證和轉換異常會影響其他兩個字段「狀態」和「錯誤」。所有這些都在對象初始化或保存時自動發生。可能? – geeljire 2013-05-03 00:02:47

回答

0

好,可能會有幾種方法:

首先,你可以導入模塊和封裝這樣你的模型對象內部的內自定義的方法相關的邏輯:

import module 
class Id1(models.Model): 

    ... 

    def custom_validate_method(self): 
     # instantiate modules classes needed 
     # write the logic needed 

然後,你就可以用Id1類的任何實例調用此方法。或者你不妨覆蓋save()方法來執行一些額外的邏輯,當您試圖堅持這樣的對象:

def custom_validate_method(self): 
     # instantiate modules classes needed 
     # write the logic needed 

    def save(self, *args, **kwargs): 
     # perform logic (maybe call custom_validate_method) 
     return super(Id1, self).save(*args, **kwargs) 

您也可以使用多重繼承來實現這一點,但看着它,多重繼承可以把一些名字衝突。它看起來像這樣:

import module 
class Id1(models.Model, module.Class): 
number = models.CharField(max_length=10) 
converted = models.CharField(max_length=13) 

def __unicode__(self): 
    return self.number 

在那裏你有在你的Id1類中繼承的模塊中需要的類的功能。

希望它有幫助。

+0

謝謝。我嘗試了多重繼承,但它抱怨'__init__'需要2個參數,我給它1.當我給它2(包含一個虛擬字符串)時,它說我給了它3而不是2。有助於理解您可以使用導入模塊的模型中的自定義方法。但是,我想將這些方法的返回值也保存在模型字段中。那可能嗎?例如,在用一個數字初始化Id1對象並保存它時,我想將它自動轉換爲Id2並將其另存爲第二個字段「轉換」。非常感謝Paulo。很好的幫助! – geeljire 2013-05-02 23:56:40

+0

沒問題,我很高興你能解決它。當然,您可以將返回值分配給字段。如果你想從類內做到這一點:'self.number' = 3,然後當你做self.save()時,它會將3保存到數據庫中。對於一個方法是一樣的:'self.number = custom_method()'。關於'__init__'參數。有了多重繼承,你應該重載'__init__',然後在ovrrided'__init__'中調用每個超類的'__init__'來避免這些問題。 – 2013-05-03 01:04:35