1

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)
4

2 に答える 2

1

を行うと、フィールド自体ではなく、フィールドのメソッドmyobj.myfieldによって返される型のオブジェクトにアクセスしています。これは、Django のメタクラス マジックによるものです。to_python


おそらく、このメソッドによって返される型でこれらのメソッドをオーバーライドする必要があります。

于 2013-02-22T22:02:12.000 に答える
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)
于 2013-02-22T22:15:01.690 に答える