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)
posted @ 2025-07-04 10:19  vx_guanchaoguo0  阅读(7)  评论(0)    收藏  举报