2012-04-30 188 views
4

我想知道是否有可能重寫字段的默認值,當它返回。說我有一個模型:Django模型:覆蓋字段返回值

class ModelA(models.Model) 
    name = models.CharField(max_length=30) 

有什麼辦法,調用

modela_instance.name 

可以返回一個修改後的值,例如名稱+「富」,但有一個附加富默認運行代碼在模型本身中,所有我需要做的就是調用名稱來獲取附加值?

我應該制定並說什麼我實際上希望做的是在模型中的方法:

def get_name(self): 
    return self.name + " foo" 

或相似的,只是想那GET_NAME方法覆蓋調用場「名稱」。

回答

10

是的,你可以使用properties做到這一點

class ModelA(models.Model) 
    _name = models.CharField(...) 

    def set_name(self, val): 
     self._name = "%s - foo" % val 

    def get_name(self): 
     return self._name 

    name = property(get_name, set_name) 
+0

謝謝,我結束了使用稍微不同的方法,現在我正在使用只讀屬性返回我的方法,而不是名稱字段本身。 – PT114

+0

另請參閱http://stackoverflow.com/questions/3757951/changing-the-behaviour-of-a-django-model-with-getattr。基本上,要麼使用屬性,要麼'__getattr__'(小心!)。 –

1

爲什麼要這麼做?不知道,但我不認爲這是一個好主意.. 但是,可以使用例如unicode的方法:

class ModelA(models.Model) 
    name = models.CharField(max_length=30) 

    def __unicode__(self): 
     return "%s : foo" % self.name 

,只是打電話時使用:

modela_instance

或者當FOO必須是動態的:

class ModelA(models.Model) 
    name = models.CharField(max_length=30) 

    def __unicode__(self): 
     return "%s : %s" % (self.name, self.make_foo()) 

    def make_foo(self): 
     return "foo" 

或定義自己的方法:

class ModelA(models.Model) 
    name = models.CharField(max_length=30) 

    def alt_name(self): 
     return "%s : foo" % self.name 
+0

我的模型的名稱由一個包含「標籤」(如{ModelB:description})的字符串組成。標籤與來自不同模型的屬性相關。因此{ModelB:description}表示另一個模型「B」的描述屬性。我有一個可以翻譯這些標籤的方法,但是有很多地方調用了名字,並且去改變它們都是不切實際的,並且如果modelc中的modelb的描述屬性來自modelc,它不會被翻譯因爲{ModelB:description}只是返回無論modelb描述所持有的字符串標記。 – PT114