2012-06-22 92 views
1

我有一個Django的模型,看起來像這樣:Django的自定義管理器添加屬性

class MyModel(models.Model): 
    field1 = models.IntegerField() 
    field2 = models.IntegerField() 
    nonDbField = SomeObject() 
    objects = MyCustomManager() 

字段1實際上是一個PK到一個抽象類SomeObject的。

我希望有一個自定義的經理,對於任何的功能(所有,過濾,得到等)返回的每個值執行以下操作:

value.nonDbField = SomeObject.objects.get(pk=value.field1) 

我測試過,我可以手動覆蓋得到像所以:

class MyCustomManager(models.Manager): 
    def get(self, *args, **kwargs): 
     value = super(MyCustomManager, self).get(*args, **kwargs) 
     value.nonDbField = SomeObject.objects.get(listid=value.itemListID) 
     return value 

但想知道是否有一種更簡單的方法來執行所有功能。

會有很多人會說,「你爲什麼這樣做?」。它與遺留的模型繼承有關,但仍然是活動的數據庫。

回答

2

如果需要nonDbField的價值是相關的字段1(或模型中的任何其他字段),你可以嘗試這樣的事:

Class MyModel(models.Model): 

    # your fields here... 

    def _nonDbField(self): 
     return SomeObject.objects.get(pk=self.field1) 
    nonDbField = property(_nonDbField) 

這允許你做這樣的事情:

MyModel.objects.get(pk=1).nonDbField 

請記住,您每次訪問nonDbField時都會進行數據庫查詢(這可能會或可能不會損害您的數據庫性能)。

+1

太棒了!正是我需要的,謝謝! – Jonathan