django net automapper是否有python实现?

icomxhvb  于 2022-11-26  发布在  Go
关注(0)|答案(4)|浏览(98)

自动Map器是一个对象-对象Map器,我们可以使用它来将域模型投影到www.example.com mvc中的视图模型asp.net。
http://automapper.codeplex.com/
在Python中有没有可以在Django(Template)/Pylons中使用的等价实现?或者说在Python世界中有必要这样做吗?

8oomwypt

8oomwypt1#

是的,有。
ObjectMapper是一个用于自动对象Map的类,它帮助你以简单、透明的方式在项目层(数据层、服务层、视图)之间创建对象。
https://pypi.python.org/pypi/object-mapper

pwuypxnk

pwuypxnk2#

这在Python中通常是不必要的,我们有一些非常复杂的域模型,我们可以很容易地在视图中使用它们,而不会注意到任何性能问题,我们每月提供数百万的页面访问量。
还要记住,Django中的“视图”在MVC中是“控制器,”而Django中的“模板”在MVC中是“视图,”因此是MTV而不是MVC。这是我最初遇到的问题:-)
如果你遇到了一些具体的问题,也可以把它作为一个问题发布...

bvuwiixz

bvuwiixz3#

下面是一个很好的Python自动Map器,它可以扩展到任何框架模型:
https://pypi.org/project/py-automapper/

bhmjp9jg

bhmjp9jg4#

我最终推出了我自己的基于.net版本的自动Map器的基本版本。

from typing import Protocol, TypeVar, Callable

from dataclasses import is_dataclass, fields
from dataclasses import MISSING

S = TypeVar("S")
T = TypeVar("T")

class IProfile(Protocol):

    mappings: dict[tuple[type[S], type[T]], dict[str, Callable[[S], object]]]

    def create_map(self,
                source_type: type[S],
                target_type: type[T],
                **mappings: Callable[[S], object]) -> None:
        ...

class IMapper(Protocol):

    def map(self, data: object, data_type: type[T]) -> T:
        ...

class Profile:

    mappings: dict[tuple[type[S], type[T]], dict[str, Callable[[S], object]]]

    def __init__(self) -> None:

        self.mappings = {}

    def create_map(self,
                source_type: type[S],
                target_type: type[T],
                **mappings: Callable[[S], object]) -> None:

        self.mappings[(source_type, target_type)] = dict(mappings)

class Mapper:

    _mappings: dict[tuple[type[S], type[T]], dict[str, Callable[[S], object]]]

    def __init__(self, profiles: list[IProfile]) -> None:

        self._mappings = {}

        for profile in profiles:
            for key, value in profile.mappings.items():
                self._mappings[key] = value

    def map(self, data: object, data_type: type[T]) -> T:

        if not is_dataclass(data_type):
            raise TypeError("type must be a dataclass")

        mapping_key = (type(data), data_type,)

        data_fields = fields(data_type)
        data_params = {}

        mappings = self._mappings.get(mapping_key, {})

        for field in data_fields:

            field_name, field_type = field.name, field.type
            field_value = getattr(data, field_name, None)

            if is_dataclass(field_type):
                field_value = self.map(field_value, field_type)
            else:
                if field_name in mappings:
                    field_value = mappings[field_name](field_value)

                if not field_value and field.default is not MISSING:
                    field_value = field.default

            data_params[field_name] = field_value

        return data_type(**data_params)

我不会说它是完美的,但它的工作足够好,为我所需要的。
https://gist.github.com/ahancock1/5e5e0c665c3e696f1e8085f7b38bd123

相关问题