2012-06-22 51 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