django字段的覆盖+运算符

时间:2013-02-22 21:24:02

标签: django django-models operator-overloading

我想覆盖Django字段的+ - 运算符:

x+y --> x | y    (bitwise or)
x-y --> x & (~y) (almost the inverse of above)

在哪里放置叠加层定义?以下是错误的:

class BitCounter(models.BigIntegerField):
    description = "A counter used for statistical calculations"
    __metaclass__ = models.SubfieldBase    

    def __radd__(self, other):
       return self | other

   def __sub__(self, other):
      return self & (^other)

2 个答案:

答案 0 :(得分:1)

执行myobj.myfield时,您正在访问field's to_python method返回的类型的对象,而不是字段本身。这是由于Django的一些元类魔法。


您可能希望在此方法返回的类型上覆盖这些方法。

答案 1 :(得分:1)

首先,创建另一个继承自int:

的类
class BitCounter(int):
    def __add__(self, other):
        return self | other

    def __sub__(self, other):
        return self & (~other)

然后在字段的to_python方法中返回此类的实例:

class BitCounterField(models.BigIntegerField):
    description = "A counter used for statistical calculations"
    __metaclass__ = models.SubfieldBase    

    def to_python(self, value):
        val = models.BigIntegerField.to_python(self, value)
        if val is None:
            return val
        return BitCounter(val)