我想覆盖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)
答案 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)