浮動小数点をサポートするために除算演算子を更新する前の作業では、datetime.timedeltaを拡張しました(python 3.xより前にはサポートされていません)。私のモデルの1つでDurationFieldを使い始めたのですが、私の拡張timedeltaクラスを使ったカスタムバージョンを作成して、クエリの後に返されるオブジェクトに自分のカスタムtimedeltaクラスが含まれるようにしたいと思います。これを実装する正しいアプローチは何ですか?Djangoモデルフィールド内のサブクラスtimedelta
私はDurationFieldクラス自体を編集していましたが、カスタムモデルフィールドを追加する方法を理解するために次のステップを実行する前に、上記の方法を理解しました。コード(modified Django source codeを次のように
class TimeDeltaExtended(datetime.timedelta):
def __div__(self, divisor):
return TimeDeltaExtended(seconds=self.total_seconds()/divisor)
def __mul__(self, multiplier):
return TimeDeltaExtended(seconds=self.total_seconds()*multiplier)
def __add__(self, other):
if isinstance(other, int) and other is 0:
return self
else:
datetime.timedelta.__add__(other)
class DurationField(Field):
...
def to_python(self, value):
if value is None:
return value
if isinstance(value, TimeDeltaExtended):
return value
try:
parsed = parse_duration(value)
except ValueError:
pass
else:
if parsed is not None:
return parsed
raise exceptions.ValidationError(
self.error_messages['invalid'],
code='invalid',
params={'value': value},
)
...
私はこのコードを使用する場合しかし、クエリがまだ通常はtimedeltaオブジェクトを返すこれは私が
環境のPython 2.7、Djangoの1.11
私は残念ながら知らない、私はどのようにすべてのフックを理解するのに苦労してきました一緒に、私の編集は本質的に疑似推測作業に基づいています!期間フィールドクラスの私の唯一の編集は 'TimeDeltaExtended'を追加することです – n0rman0