2012-12-18 156 views
6

一般来说,我不熟悉Python的重写方法和使用super()的方式。Django:覆盖get_FOO_display()

问题是:我可以覆盖get_FOO_display()

class A(models.Model): 
    unit = models.IntegerField(choices=something) 

    def get_unit_display(self, value): 
    ... use super(A, self).get_unit_display() 

我想重写get_FOO_display(),因为我想复数化我的显示。

super(A, self).get_unit_display()不起作用。

回答

7

通常情况下,您只需重写一个方法,如您所示。但这里的诀窍是get_FOO_display方法不存在于超类中,因此调用super方法将不会执行任何操作。当元类添加到模型中时,该方法由字段类动态添加 - 请参阅the source here

你可以做的一件事是为你的unit字段定义一个自定义字段子类,并覆盖contribute_to_class,以便它构建你想要的方法。不幸的是,这有点棘手。

(我不明白你的第二个问题。你到底是问什么?)

+0

对不起,忽略我解释不好的第二个问题。我明白了。 – dtc

-3

您应该可以通过在子类上创建一个名称相同的方法来覆盖超类的任何方法。不考虑参数签名。例如:

class A(object): 
    def method(self, arg1): 
     print "Method A", arg1 

class B(A): 
    def method(self): 
     print "Method B" 

A().method(True) # "Method A True" 
B().method() # "Method B" 

在get_unit_display()的情况下,你不必调用super()在所有的,如果你想改变显示的值,但如果你想使用超(),确保你与正确的签名调用它,例如:

class A(models.Model): 
    unit = models.IntegerField(choices=something) 

    def get_unit_display(self, value): 
     display = super(A, self).get_unit_display(value) 
     if value > 1: 
      display = display + "s" 
     return display 

注意,我们传递的价值超()的get_unit_display()。

+2

这将是真实的,如果它是任何其他的常规方法,但get_FOO_display是由特殊的Django魔术创造,像指向对方的回答。 –