django orm mongodb 自动转换机制
数据库的值 和 代码产生映射
class StatusIntField(IntField):
STATUS_MAP = {
ConsumeRecord.Status.CREATED: 0,
ConsumeRecord.Status.INIT: 1,
ConsumeRecord.Status.WAITING: 2,
ConsumeRecord.Status.UNKNOWN: 3,
ConsumeRecord.Status.RUNNING: 4,
ConsumeRecord.Status.END: 5,
ConsumeRecord.Status.WAIT: 6,
ConsumeRecord.Status.TIMEOUT: 7,
ConsumeRecord.Status.FAILURE: 8,
ConsumeRecord.Status.FINISHED: 9,
ConsumeRecord.Status.CHARGED: 10,
ConsumeRecord.Status.REFUND: 11
}
REVERSE_STATUS_MAP = {_enum: _status for _status, _enum in STATUS_MAP.items()} # type: Dict
def __init__(self, *args, **kwargs):
# Ensure default is set to a valid enum value if provided
if 'default' in kwargs:
kwargs['default'] = self.STATUS_MAP[kwargs['default']]
super(StatusIntField, self).__init__(*args, **kwargs)
def to_mongo(self, value):
if value is None:
return None
try:
int_value = self.STATUS_MAP[value]
except KeyError:
raise ValueError("Invalid status enum: {}. Must be one of {}".format(
value, list(self.STATUS_MAP.keys())
))
else:
return int_value
def to_python(self, value):
if value is None:
return None
int_value = super(StatusIntField, self).to_python(value)
try:
return self.REVERSE_STATUS_MAP[int_value]
except KeyError:
raise ValueError(
"Invalid status value: {}. Must be one of {}".format(int_value, list(self.REVERSE_STATUS_MAP.keys())))
def prepare_query_value(self, op, value):
if value is None:
return value
int_value = self.to_mongo(value)
return super(StatusIntField, self).prepare_query_value(op, int_value)
本文来自博客园,作者:vx_guanchaoguo0,转载请注明原文链接:https://www.cnblogs.com/guanchaoguo/p/18965129