2013-11-15 67 views
1

我有一個Django抽象模型。覆蓋類屬性,用通用方法引用類

class Company(models.Model): 
    DEFAULT_EMPLOYEES = None 
    employees = models.PositiveIntegerField(null=True, blank=True, 
              default=<<<what_goes_here>>>.DEFAULT_EMPLOYEES) 
    class Meta: 
     abstract = True 

class BestBuy(Company): 
    DEFAULT_EMPLOYEES = 1000 

我有興趣重寫類屬性作爲默認值使用。我想知道是否有一種通用的方式來引用這個類來使這成爲可能。在Company我意識到我可以使用Company.DEFAULT_EMPLOYEES來引用屬性,但有沒有這樣一種方式:"CurrentCLass".DEFAULT_EMPLOYEES

我很肯定self不能在這裏工作,因爲這些定義中沒有實例。只是類

有沒有更好的方法來解決這個問題,以允許子類指定一個默認值?任何幫助將不勝感激。謝謝。

+2

爲什麼不只是在每一個模型中定義的字段?要做你想做的事情可能會很麻煩並且容易出錯,你需要深入研究Django的元類功能 –

+0

你可能會用'inspect.currentframe()'做類似的事情......等等,但是這是一個無意義的事情,如果你只是這樣做,以避免再次寫入屬性.. –

回答

2

最好的辦法是取代保存功能來設置員工,如果在保存時它是空白的。

喜歡的東西:

class Company(models.Model): 
    ... 
    def save(self, *args, **kw): 
     if self.employees is None: 
      self.employees = self.DEFAULT_EMPLOYEES 
     super(Company, self).save(*args, **kw) 

在每個子類中的定義DEFAULT_EMPLOYEES爲你做了。

另一種方法是修改可能矯枉過正的元類。

+1

可能不是一個好的解決方案,'save()'[不叫](http://goo.gl/GmuhcS )''bulk_create()''我不認爲這種方法將與Django的同步命令,南部和序列化基礎設施。 –

+0

在各種情況下都不是很好,但99%的應用程序都可以。不是一個好的解決方案,而是最好的簡單解決方案 – SColvin

0

定義一個類方法對你的父母:

@classmethod 
def showDefaultEmployees(cls): 
    return cls.DEFAULT_EMPLOYEES 

然後,只需從你的類實例調用它

BestBuy.showDefaultEmployees()